为啥 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?

在jsp中使用jtable为所有表添加分页

MySQL - WHERE 子句中的 NOT IN 查询具有相同的结构,适用于第一个表但不适用于第二个表

为啥这只适用于 main 中的所有内容?

为啥 F# 中的幂运算符仅适用于浮点数?