MySQL:查找没有提交的用户

时间:2015-07-03 09:31:57

标签: mysql sql where-clause not-exists

我正在努力查询一下,希望你能提供帮助。 我有两张桌子。与所有用户和一个提供表单信息的用户。 两者都包含用户ID。 我需要知道的是,users表中的哪个用户没有出现在报表上。

这是我到目前为止所做的:

SELECT u.ID, u.display_name, u.user_email, r.user_id
FROM users AS u
LEFT JOIN report AS r ON u.ID = r.user_id
WHERE NOT EXISTS(
    SELECT * 
    FROM report AS rr
    WHERE u.ID = rr.user_id
)

对于绝对没有提交过表单的用户来说,这似乎没什么问题。 但是报告表还包含一个日期列,我想知道如何按日分组。 在前端,我希望有一张表格显示:

date: user:
2015-01-01 user a
2015-01-01 user f
2015-01-02 user g
2015-01-02 user a
2015-01-03 user z
2015-01-03 user x

用户是那天没有提交表单的用户。

希望你能提供帮助。预先感谢!

5 个答案:

答案 0 :(得分:2)

如果要获取报表中没有任何行的用户列表,则可以生成一个集合,该集合是用户的笛卡尔积和报表中存在的日期,然后与该集合进行左连接并检查是否为空。

由交叉连接形成的笛卡尔集将包含日期和用户的所有可能组合;报告表中包含的内容是所有用户都在所有可用日期添加了报告。

select r.date, u.user_id 
from report r 
cross join users u
left join (select r.date, r.user_id from users as u join report as r on u.id = r.user_id)
a on a.date = r.date and a.user_id = u.user_id
where a.date is null

Sample SQL Fiddle

对于大多数其他数据库,这可以通过设置差异运算符(减去或除外)而不是左连接来完成。

答案 1 :(得分:2)

我对报告表中的列名做出了假设:

SELECT x.report_date, u.user_id, u.display_name
FROM users u
JOIN (
  SELECT DISTINCT report_date
  FROM reports
) x
LEFT JOIN reports r
  ON r.user_id = u.user_id
  AND r.report_date = x.report_date
WHERE r.report_date IS NULL
ORDER BY x.report_date, u.user_id

看看这个小提琴:http://sqlfiddle.com/#!9/407ac/5

答案 2 :(得分:1)

使用where子句的左外连接...

这是一个很好的链接......

http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/

SELECT * FROM `users`
LEFT OUTER JOIN `report`
ON `users`.`ID` = `report`.`user_id`
WHERE `report`.`user_id` IS null
ORDER BY `report`.`Date`

答案 3 :(得分:0)

当然你可以通过你想检查的日期吗?

这样的事情(使用@reportDate作为参数):

SELECT * FROM users
LEFT OUTER JOIN report
ON users.ID = report.user_id
WHERE report.user_id IS NULL
AND report.Date = @reportDate

答案 4 :(得分:0)

您可以获取没有报告的用户/日期对。使用cross join生成所有可能的行,然后筛选出存在的行:

select u.*, r.date
from users u cross join
     (select distinct date from reports r) d left join
     reports r
     on u.id = r.user_id and d.date = r.date
where r.userid is null;