为啥 mysql 中的这个查询适用于该表,但不适用于该表的视图?
Posted
技术标签:
【中文标题】为啥 mysql 中的这个查询适用于该表,但不适用于该表的视图?【英文标题】:Why this query in mysql works fine with the table but not with the view of that table?为什么 mysql 中的这个查询适用于该表,但不适用于该表的视图? 【发布时间】:2018-01-06 14:18:29 【问题描述】:请看图片。
以下查询在使用表“participants
”执行时效果很好:
SELECT
*
FROM
(SELECT
p.*, @curRow:=@curRow + 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
但是,当我用视图 'vparticipants
' 替换 'participants
' 时,我无法得到相同的结果,这应该是相同的。
问题是结果的顺序不同。
使用该表,我得到按createdOn
列(日期)和position
列的后代排序的行,其值从1 到25,但使用视图“vparticipants”我得到列“位置”开始从 6 到 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`)))
感谢任何帮助。
正确的结果图片:
错误的结果图片(查看):
【问题讨论】:
是使用视图所必需的,因为它提供了协议签名表列 您有一个 GROUP BY 子句,但没有聚合函数。通常,这将返回大致不确定的结果,但可能会受到任何可能存在的索引的影响。在 mysql 中,视图(我认为)没有索引意识,所以我怀疑这可能会影响结果。 【参考方案1】:这是因为 ORDER BY 不适用于视图,请参阅this 链接,这是 SQL SERVER 在视图中的限制。最好不要使用视图来编写此查询
【讨论】:
是mysql,我删除了order by 还是不行。 您应该使用直接查询或将所有逻辑放在视图本身中 在您的视图中,您已经加入了另外两个表,并且它们肯定也会在查询视图时影响结果,只需删除那些左连接,然后在结果正常时再试一次以上是关于为啥 mysql 中的这个查询适用于该表,但不适用于该表的视图?的主要内容,如果未能解决你的问题,请参考以下文章
这个 mySQL “空间”查询是不是也适用于 SQL Server 2008?