我从测试中得到了一个问题,它似乎是一个概念问题或逻辑问题,所以根本没有数据。请阅读:
假设没有语法错误,列名和表名都正确,下面的MySQL查询有什么问题?
- 对于我们每个用户,这应该返回他们发送的消息数
select u.user_id, sum(case when um.message_id is not null then 1 else 0 end) as number_of_messages_sent
from users u left join
users_messages um
on um.user_id = u.user_id
where um.status = 'sent'
group by u.user_id;
如果有人有任何想法,请帮助我。
答案 0 :(得分:1)
where
子句正在将left join
变为inner join
。因此,它只返回至少发送一条消息的用户。这不是问题的意图。
编写查询的更好方法是使用count()
并通过将条件移动到on
子句来解决问题:
select u.user_id, count(um.message_id) as number_of_messages_sent
from users u left join
users_messages um
on um.user_id = u.user_id and um.status = 'sent'
group by u.user_id;
答案 1 :(得分:1)
您正在使用status =“sent”过滤所有结果。最终结果不是“所有用户和masseges”。最终结果是“发送一次或多次按摩的所有用户”。
此查询是所有用户,if是否存在按摩
SELECT u.user_id, COUNT(um.message_id)
FROM users AS u, users_messages AS um
WHERE um.user_id = u.user_id
GROUP BY u.user_id;
此查询将返回发送至少1次按摩的用户。 U不会看到尚未发送按摩的用户。
SELECT u.user_id, COUNT(um.message_id)
FROM users AS u, users_messages AS um
WHERE um.user_id = u.user_id AND status="sent"
GROUP BY u.user_id;
答案 2 :(得分:0)
select
查询中的列为u.user_i
,group by
中的列为u.user_id
答案 3 :(得分:0)
错在哪里:
您的查询假设我们拥有每个用户,但它只返回已发送邮件的用户。这是因为您的WHERE
子句过滤了未发送任何消息的用户。让我用一个例子来说明这一点。
示例:强>
我使用此代码制作了一些包含数据的示例表:
CREATE TABLE userz (
user_id int,
) ;
INSERT INTO userz (user_id)
VALUES
(1),(2),(3)
CREATE TABLE userz_messages(
message_id int,
user_id int,
status varchar(10)
)
INSERT INTO userz_messages (message_id,user_id,status)
VALUES
(1,1,'sent'),
(2,2,'sent'),
(3,3,'sent'),
(4,4,'notsend'),
(5,1,'sent'),
(6,2,'sent')
userz_table:
user_id
-----------
1
2
3
userz_message表:
message_id user_id status
----------- ----------- ----------
1 1 sent
2 2 sent
3 3 sent
4 4 notsend
5 1 sent
6 2 sent
当我们执行您的查询时,我们得到结果:
user_id number_of_messages_sent
----------- -----------------------
1 2
2 2
3 1
带有user_id 4的注意用户不在结果集中?这是查询的错误。它没有得到每个用户。
希望我的例子可以帮助您更好地理解您的问题