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