【问题标题】:SQL count function difference between equals operator and in operatorSQL count 函数在 equals 运算符和 in 运算符之间的区别
【发布时间】:2019-09-25 04:02:21
【问题描述】:

这个问题与以下hackerrank挑战有关: https://www.hackerrank.com/challenges/challenges/problem

有效的版本返回正确的结果集,而另一个返回不完整的结果集,因为 count(*) 在 in 子句中无法按预期工作

这两个代码片段之间的唯一区别是 or 的第一个子句中的 c_count 而不是 count(*)。

由于 c_count 等于 count(*),所以应该没有语义差异。如果count(*) in 语法错误,为什么count(*) = 有效?

这行得通:

select count(*) as c_count ... having c_count in (select ...) or count(*) = (select ...);

这行不通:

select count(*) as c_count ... having count(*) in  (select ...) or count(*) = (select ...);

这是原始查询。 /**/评论指出两者的区别:

工作:

SELECT h.hacker_id
    ,h.name
    ,count(*) AS c_count
FROM Hackers h
JOIN Challenges c ON h.hacker_id = c.hacker_id
GROUP BY h.hacker_id, h.name
HAVING 
    /*USING c_count ALIAS*/ 
    c_count IN (
        SELECT hacker_c_counts2.c_count2
        FROM (
            SELECT count(*) AS c_count2
            FROM Challenges c2
            GROUP BY c2.hacker_id
            ) AS hacker_c_counts2
        GROUP BY hacker_c_counts2.c_count2
        HAVING count(*) = 1
        )
    OR count(*) = (
        SELECT max(hacker_c_counts.c_count1)
        FROM (
            SELECT count(*) AS c_count1
            FROM Challenges c1
            GROUP BY c1.hacker_id
            ) AS hacker_c_counts
        )
ORDER BY count(*) DESC,  h.hacker_id;

不工作:

SELECT h.hacker_id
    ,h.name
    ,count(*) AS c_count
FROM Hackers h
JOIN Challenges c ON h.hacker_id = c.hacker_id
GROUP BY h.hacker_id, h.name
HAVING 
    /*USING count(*) directly*/ 
    count(*) IN (
        SELECT hacker_c_counts2.c_count2
        FROM (
            SELECT count(*) AS c_count2
            FROM Challenges c2
            GROUP BY c2.hacker_id
            ) AS hacker_c_counts2
        GROUP BY hacker_c_counts2.c_count2
        HAVING count(*) = 1
        )
    OR count(*) = (
        SELECT max(hacker_c_counts.c_count1)
        FROM (
            SELECT count(*) AS c_count1
            FROM Challenges c1
            GROUP BY c1.hacker_id
            ) AS hacker_c_counts
        )
ORDER BY count(*) DESC, h.hacker_id;

【问题讨论】:

  • 删除尽可能多的代码,仍然有问题。
  • 我有点困惑。您有多个查询和片段,其中一些有效,有些无效。很难按照您的要求进行操作。
  • 你能再检查一次吗
  • 我无法使用更简化的查询来复制 [like this]。(sqlfiddle.com/#!9/287e79/3) 也许我错过了什么?
  • 我已经重新添加了您原来的复杂 SQL,因为除了使用您的别名与直接使用 count(*) 之外可能存在问题。

标签: mysql sql syntax


【解决方案1】:

试试这个.....h.c_count in.....在c_count之前使用表格别名“h”。

祝你好运。

【讨论】:

  • 它已经在 .... 中与 c_count 一起使用了,奇怪的是 count(*) in ... 返回一个空集
  • 您是否尝试在 .* 之前使用表别名?如果这与 mysql 版本有关,可能是这样。
  • count(h.name) 替换count(*) IN 也不起作用:(
猜你喜欢
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 2015-12-09
  • 2016-05-18
  • 2011-10-22
  • 2012-10-06
相关资源
最近更新 更多