找到SQL的问题

时间:2017-07-09 14:03:54

标签: mysql sql

我从测试中得到了一个问题,它似乎是一个概念问题或逻辑问题,所以根本没有数据。请阅读:

假设没有语法错误,列名和表名都正确,下面的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;

如果有人有任何想法,请帮助我。

4 个答案:

答案 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_igroup 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的

注意用户不在结果集中?这是查询的错误。它没有得到每个用户。

希望我的例子可以帮助您更好地理解您的问题