2017-07-31 47 views
2

請看圖片。與表「participants‘執行時爲什麼mysql中的這個查詢可以正常工作,但不能與該表的視圖匹配?

下面的查詢的偉大工程:

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應該是一樣的。

問題是結果的順序是不同的。

使用該表,我得到了createdOn列(日期)和position列中值從1到25開始排序的行,但使用視圖'vparticipants'我得到的列'position'從6開始到30,並且列創建的順序方向順序。我需要與表格相同的結果。

的觀點很簡單,在這裏:

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`))) 

感謝任何幫助。

正確的結果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

在您的視圖中您已經加入了兩個以上的表格,當然,它們也會在查看視圖時影響結果,只需刪除那些左連接,然後再次嘗試if結果是好的 –

相關問題