2017-07-31 3 views
2

画像を見てください。なぜmysqlのこのクエリはテーブルでうまく動作しますが、そのテーブルのビューではうまくいかないのですか?

次のクエリのテーブルで実行されたときに素晴らしい作品「participants 『:

SELECT 
    * 
FROM 
    (SELECT 
     p.*, @curRow:[email protected] + 1 AS position 
    FROM 
     (SELECT @curRow:=0) r, 
     participants p 
    WHERE 
     (p.isVolunteer = 0 
      OR p.isVolunteer IS NULL) 
    GROUP BY p.id 
    ORDER BY p.lastRegistrationDate DESC 
    LIMIT 0 , 25) AS p 
     INNER JOIN 
    participants_registrations pr ON p.id = pr.participantId 
     INNER JOIN 
    registrations r ON pr.registrationId = r.id 
ORDER BY p.position ASC , r.createdOn DESC 

しかし、私はビューで』 participants」を置き換える「vparticipants」私は同じ結果を得ることができない、それはsuposedされます同じでなければなりません。

問題は結果の順序が異なることです。テーブルを使用し

IはcreatedOnカラム(日付)と1から25までの初期値とpositionカラムによって子孫に順序付け行を取得するが、ビューを使用して私は、列「位置」は6から始め得る「vparticipants」 30であり、列createdOnの順序は昇順である。私はテーブルと同じ結果が必要です。

ビューここは、非常に簡単です:

CREATE 
    ALGORITHM = UNDEFINED 
    DEFINER = `root`@`localhost` 
    SQL SECURITY DEFINER 
VIEW `vparticipants` AS 
    SELECT 
     `participants`.`id` AS `id`, 
     `participants`.`identificationNumber` AS `identificationNumber`, 
     `participants`.`firstName` AS `firstName`, 
     `participants`.`lastName` AS `lastName`, 
     `participants`.`email` AS `email`, 
     `participants`.`cellphone` AS `cellphone`, 
     `participants`.`city` AS `city`, 
     `participants`.`gender` AS `gender`, 
     `participants`.`shirtSize` AS `shirtSize`, 
     `participants`.`bloodType` AS `bloodType`, 
     `participants`.`emergencyContactName` AS `emergencyContactName`, 
     `participants`.`emergencyContactPhone` AS `emergencyContactPhone`, 
     `participants`.`eps` AS `eps`, 
     `participants`.`birthday` AS `birthday`, 
     `participants`.`memberOfGroupId` AS `memberOfGroupId`, 
     `participants`.`memberOfGroupName` AS `memberOfGroupName`, 
     `participants`.`lastRegistrationDate` AS `lastRegistrationDate`, 
     `participants`.`isVolunteer` AS `isVolunteer`, 
     `agreements_signatures`.`signatureRequest` AS `signatureRequest`, 
     `agreements_signatures`.`signature` AS `signature`, 
     `agreements_signatures`.`manualSignature` AS `manualSignature`, 
     `agreements_signatures`.`fromWhereWasSigned` AS `fromWhereWasSigned`, 
     `agreements_signatures`.`responsibleName` AS `responsibleName`, 
     `agreements_signatures`.`responsibleIdentificationNumber` AS `responsibleIdentificationNumber`, 
     `agreements_signatures`.`expeditionPlace` AS `expeditionPlace`, 
     `agreements_signatures`.`signedIn` AS `signedIn` 
    FROM 
     ((`participants` 
     LEFT JOIN `participants_registrations` ON ((`participants_registrations`.`participantId` = `participants`.`id`))) 
     LEFT JOIN `agreements_signatures` ON ((`agreements_signatures`.`id` = `participants_registrations`.`agreementSignatureId`))) 

おかげで任意のヘルプ。

RIGHT結果IMAGE: enter image description here

間違った結果IMAGE(VIEW): enter image description here

+0

は、合意のシグネチャテーブルの列を提供するため、ビューを使用する必要があります。 –

+0

GROUP BY句がありますが、集計関数はありません。通常、これは不確定な結果を広範に返しますが、その場にある可能性のあるインデックスの影響を受ける可能性があります。 MySQLでは、ビューにはインデックスの認識がないので、結果が影響している可能性があります。 – Strawberry

答えて

0

そのORDER BYはビューにthisリンクは、SQL Serverのその制限を参照して、ビューでは動作しませんので。ビューを使用せずにこのクエリを記述する方が良い

+0

これはmysqlです。私は注文を取り除いて動作しません。 –

+0

ダイレクトクエリを使用するか、すべてのロジックをビュー自体に入れてください。 –

+0

ビューに2つ以上のテーブルを追加してください。また、ビューでクエリを実行している間に結果が反映されます。結果はOKです –

関連する問題