查询应该返回0但返回1

时间:2018-10-09 13:53:53

标签: sql

SELECT
    COUNT(reservations.personal_information_id) AS returningVisitors,
    (SELECT COUNT(reservations.personal_information_id) FROM reservations) AS totalVisitors,
    ROUND
    (
        (
            COUNT(reservations.personal_information_id)
    *
            100
        )
    /
        (SELECT COUNT(reservations.personal_information_id) FROM reservations)
    ) AS percent
    FROM
        reservations
    GROUP BY
        reservations.personal_information_id
    DESC
    LIMIT 1

此查询返回

╔═════════════════════════════════════════╗
║ returningVisitors totalVisitors percent ║
╠═════════════════════════════════════════╣
║ 1                 62            2       ║
╚═════════════════════════════════════════╝

但应该返回

╔═════════════════════════════════════════╗
║ returningVisitors totalVisitors percent ║
╠═════════════════════════════════════════╣
║ 0                 62            0       ║
╚═════════════════════════════════════════╝

有人知道如何制作它,以便它返回0而不是1吗?

1 个答案:

答案 0 :(得分:1)

好吧,没有告诉您“您需要做X”(因为有评论说,您没有在帖子中放置足够的信息来确定您要完成的任务)-我而是说“这是您的查询当前正在执行的操作”,这可能有助于您了解问题所在。

首先,这是您的一般查询结构:

select
    count(someField),
    ResultOfASubQuery,
    FieldWereGoingToIgnoreForNow
from table
group by columnA

该count(someField)无关紧要-它可以是count(otherField)或count(*)-它会返回groupBy中的记录数。因此,您真正要看的是:

select count(*)
from table
group by columnA

...又名,您可以为columnA的每个不同条目期望一行。在您的情况下,它是“ personalInformationID”-您将为每个ID获得一行。如果您有100个ID,那么您将获得100行(几乎可以肯定不是您想要的。)

现在,当我们在其中添加子查询内容时,它将为每一行运行子查询。因此,您的结果将类似于:

Row for ID#1 - 1, CountOfVisitors, DivisionResult
Row for ID#2 - 1, CountOfVisitors, DivisionResult
Row for ID#3 - 1, CountOfVisitors, DivisionResult
Row for ID#4 - 1, CountOfVisitors, DivisionResult
Row - ... etc

为什么第一列始终为“ 1”?因为那是count(*)为您提供的ID。只有一行与ID#1相匹配。与ID#2匹配的一行。与ID#3匹配的一行。

最后,您获得了“限制1”。这不会压缩数据,而是说:“我只想要第一行”,也就是对应于ID#1的行。因此,您的结果是:

Row for ID#1 - 1, CountOfVisitors, DivisionResult

希望这可以解释您当前的查询版本正在做什么,以及为什么它不适用于您。就像我提到的那样,由于我们不知道您要执行的操作,因此您并未真正详细地告诉您“执行此操作”。