免责声明:这是一个纯粹的理论问题,因为我有一个正确的工作代码。
你好,我是
我有一个简单的问题,但我猜答案不会简单。我试图用这个代码来实现的是获得所有发送者ID和所有消息的消息ID,这些消息是由我们至少收到两条消息的发送者发送的。
这是正确的工作代码:
select msg_id, sender_id
from messages
where sender_id in(
select sender_id
from messages
group by sender_id
having count(sender_id)>1);
我的问题是为什么下面的代码不能做。它返回一个没有数据的空表。我的意思是,group by和having的内部工作原理是什么,阻止了下面的代码工作。如果需要的话,你可以达到关系演算的水平。
select sender_id, msg_id from messages
group by sender_id, msg_id
having count(sender_id) > 1;
最后一件需要考虑的事情是,这显然是有效的:
select sender_id from messages
group by sender_id
having count(sender_id) > 1;
那为什么多加一列就会破坏结果呢?
1条答案
按热度按时间6vl6ewon1#
一个简单的解决方案(不涉及自连接)是使用解析
COUNT
函数和内联视图:我的问题是为什么下面的代码不能做。[...]
你
GROUP BY
sender_id
和msg_id
,所以如果每个组只有一行(即,因为msg_id
是唯一的,或者每个msg_id
和sender_id
元组都是唯一的),那么将永远不会满足HAVING
过滤器,因此从输出中排除所有行。最后一件需要考虑的事情是,这显然是有效的:
是的,因为您没有按
sender_id
和msg_id
进行分组;你只按sender_id
分组,在该组中将有多个msg_id
。