MySQL选择列 计算(name) 当条件成立时 按列分组?

3

嘿,这是我使用的SQL语句:

$sql = "SELECT number, COUNT(name) FROM people WHERE id='$id' GROUP BY number";  
$result = mysql_query($sql);

while($row = mysql_fetch_array($result)){
$statarray['stat'.$i] = $row['COUNT(name)'];
$i++; }

数字列针对每个名称存储0、1、2或3,因此数组返回的是每个数字对应的名称总数,这很好运行。唯一的问题是,如果所有名称都存储了数字1,我的数组条目“stat0”不会告诉我有多少个0,因为它被1的数量所替换(这是因为数组中没有0,因此第一个输出是1)... 我该如何找出有多少个名称在它们的数字列中具有0、1、2和3,包括没有的情况?..提前致谢。
1个回答

3
SELECT  numbers.number ,
        COUNT(name)
FROM    ( SELECT    0 AS number
          UNION ALL
          SELECT    1
          UNION ALL
          SELECT    2
          UNION ALL
          SELECT    3
        ) numbers
        LEFT JOIN people ON people.number = numbers.number AND id='$id' 
GROUP BY numbers.number

如果你有一个永久的数字表格,如评论所述

SELECT  numbers.number ,
        COUNT(name)
FROM    numbers
        LEFT JOIN people ON people.number = numbers.number
                            AND id = '$id'
WHERE   numbers.number BETWEEN 0 AND 3
GROUP BY numbers.number

谢谢Martin,你能否解释一下这是如何工作的? - Wez
您只能选择数据中存在的值。这将创建一个内联派生表,其中包含所有值(拥有永久辅助数字表非常有用,我认为可能更有效)。左连接保留左侧输入中的所有值,即使右侧输入中没有匹配项也是如此。 - Martin Smith
太好了,如果我有一个保存我的数字的辅助/参考表,那么我可以将这个SELECT与它连接起来,而不是创建一个内联表?这将如何改变这个语句? - Wez
@Wezly - 已更新。顺便提一下,我注意到我的第一个版本中有一个错误。 id 的过滤器需要放在连接条件中,以避免使其成为内连接。 - Martin Smith
非常感谢。冒着提问过多的风险,如果我想在people表中检查另一列..比如'number2',最好是用第二个语句还是可以包含在这个语句中? - Wez
我不确定你确切的意思。最好作为一个新问题来问,并提供一些示例数据。 - Martin Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接