Mysql 我可以用Group By计算多个列吗?

Mysql 我可以用Group By计算多个列吗?,mysql,group-by,count,Mysql,Group By,Count,我有一个包含以下列的表: s, s2, s3 1, 2, 3 4 1, 3 4, 2, 2, 1 3, 4 4 我想知道s列中的唯一值在s、s2和s3列中出现了多少次 到目前为止,我已经: $query = "SELECT s, COUNT(*) as count FROM table GROUP BY s"; 这将给我: 1 - count 2 2 - count 1 3 - count 1 4 - count 3 但我想计算s2和s3列

我有一个包含以下列的表:

s, s2, s3  
1, 2,  3  
4  
1, 3  
4, 2,  
2, 1  
3, 4  
4  
我想知道s列中的唯一值在s、s2和s3列中出现了多少次

到目前为止,我已经:

$query = "SELECT s, COUNT(*) as count FROM table GROUP BY s";
这将给我:

1 - count 2  
2 - count 1  
3 - count 1  
4 - count 3  
但我想计算s2和s3列,因此结果将是:

1 - count 3  
2 - count 3  
3 - count 3  
4 - count 4
你知道我必须如何编辑查询,这样我才能根据s列的值来计算s列、s2列和s3列组吗

亲切问候,


Arie

您需要所有列的UNION ALL,然后对它们进行计数:

select
  t.s, count(*) counter
from (
  select s from tablename union all
  select s2 from tablename union all
  select s3 from tablename
) t
where t.s is not null
group by t.s
请参阅。
结果:

如果在
s2
列和
s3
列中存在
s
列中不存在的值,并且您希望将其排除在外,则不要:

where t.s is not null
使用


@福帕斯的回答很好。但是,你应该考虑两件事。
  • 由于使用了
    union
    ,随着数据大小的增加,查询速度会变慢
  • 如果输入如下所示:
  • 提供的查询结果将是:

    | s   | counter |
    | --- | ------- |
    | 1   | 3       |
    | 2   | 3       |
    | 3   | 3       |
    | 4   | 4       |
    | 5   | 1       |
    
    然而,它应该保持不变,因为s列中没有5

    为了解决上述两个问题,我建议使用JOIN而不是UNION的方法:

    SELECT t3.s, IF(t3.s = t4.s3, cnt1 + 2, cnt1 + 1) as counter FROM 
        (SELECT *, count(*) AS cnt1 FROM 
            (SELECT s from table) AS t1 
            LEFT JOIN 
            (SELECT s2 FROM table) AS t2 
            ON t1.s = t2.s2 GROUP BY t1.s
        ) AS t3 
        LEFT JOIN 
        (SELECT s3 FROM table) AS t4 
        ON t3.s = t4.s3 
    ORDER BY t3.s
    
    这个查询看起来可能有点冗长和复杂,但当您深入研究逻辑时,它确实很简单

    步骤1
    我在这里做的是从s列到s2做一个左连接,并计算结果,这样它将给你一个比总数少1的数字,因为它将使关系从左到右

    步骤2
    然后我做了一个从s到s3的左连接,如果找到关系,则只将步骤1的计数增加1

    步骤3
    最终,我将计数增加了1,这样我们就可以将关系的数量转换为enities的数量


    我希望这是有意义的

    您可能希望重新设计具有M:N关系的表,并使用
    JOIN
    s@forpas在问题中,OP说:“我想知道s列中的唯一值在s、s2和s3列中出现了多少次”,这强调了我们只对s列的值感兴趣,因此,如果s2列和s3列中出现了一些s列中不存在的值,则只需ignored@Arie我的回答解决了你的问题吗?如果是,请将其标记为已接受以关闭stackoverflow上的此线程。非常感谢。为什么投反对票?每当你投反对票的时候,请不要发表评论。我不记得我投了反对票,我不想那样做;-)@请注意我在使用您接受的答案时提到的问题。如果它不打扰你的需要,那么一切都好。只是想让你知道我第一次使用Union,我必须说,它看起来很简单…;-)这很简单,但对于非常大的数据集来说效率不高。另一个简单的问题是,在我的帖子中,我遗漏了一些Where子句,因为我认为它们很容易插入,但我无法完成这项工作。还有另外两个栏目,季节和轮次,我想加上其中季节='2018/2019'和轮次=34,但我得到一个错误,栏目季节不合适。有什么想法吗?您必须在select语句中指定它们才能在where子句中使用它们。我在中尝试了此操作,但在“字段列表”中仍然出现错误“未知列”tablename.seasure
    s, s2, s3  
    1, 2,  3  
    4  
    1, 3  
    4, 2,  
    2, 1  
    3, 4  
    4     5
    
    | s   | counter |
    | --- | ------- |
    | 1   | 3       |
    | 2   | 3       |
    | 3   | 3       |
    | 4   | 4       |
    | 5   | 1       |
    
    SELECT t3.s, IF(t3.s = t4.s3, cnt1 + 2, cnt1 + 1) as counter FROM 
        (SELECT *, count(*) AS cnt1 FROM 
            (SELECT s from table) AS t1 
            LEFT JOIN 
            (SELECT s2 FROM table) AS t2 
            ON t1.s = t2.s2 GROUP BY t1.s
        ) AS t3 
        LEFT JOIN 
        (SELECT s3 FROM table) AS t4 
        ON t3.s = t4.s3 
    ORDER BY t3.s