我正在努力查询一下,希望你能提供帮助。 我有两张桌子。与所有用户和一个提供表单信息的用户。 两者都包含用户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
用户是那天没有提交表单的用户。
希望你能提供帮助。预先感谢!
答案 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
对于大多数其他数据库,这可以通过设置差异运算符(减去或除外)而不是左连接来完成。
答案 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;