我们有3个不同的表格 即。用户,daily_status,status_types
表中的字段
用户:
id,
name,
department_id
用户表的数据:
u1 jai 1
u2 singh 1
u3 test 2
daily_status:
id,
user_id,
status_id,
date
daily_status表的数据:
1 u1 2 '23/10/2013'
2 u1 3 '24/10/2013'
3 u2 3 '23/10/2013'
4 u3 2 '23/10/2013'
5 u3 2 '23/10/2013'
status_types:
id,
status_name,
status_types表的数据
1 present
2 leave
3 sick
我需要像这样进行查询
SELECT user.id, user.name status.name
LEFT JOIN daily_status as ds ON (user.id=ds.user_id)
LEFT JOIN status_types as status ON (ds.status_id=status.id)
WHERE user.department_id=1 AND ds.date='24/10/2013'
目前的结果:
u1 jai sick
但我想要
u1 jai sick
u2 singh -
根据查询结果很好,但是我需要重新配置它,以便它为我提供该部门所有用户的详细信息,这些用户在daily_status表中没有该日期的状态。
答案 0 :(得分:0)
将日期验证移至ON:
SELECT u.id, u.name, status.status_name
FROM user u
LEFT JOIN daily_status as ds ON u.id=ds.user_id AND ds.date='24/10/2013'
LEFT JOIN status_types as status ON ds.status_id=status.id
WHERE u.department_id=1
答案 1 :(得分:0)
如果你做一个OUTER JOIN并把一个WHERE somethingFromMyLeftJoinedTable =“something”,你将只得到LEFT JOINed表中存在“something”的结果。
要解决此问题,您可以将WHERE date ='xxx'移动到查询的JOIN部分,如下所示
SELECT user.id, user.name status.name
LEFT JOIN daily_status as ds ON user.id=ds.user_id AND ds.date = '24/10/2013'
LEFT JOIN status_types as status ON (ds.status_id=status.id)
WHERE user.department_id=1
希望这有帮助。
答案 2 :(得分:0)
试试这个
SELECT user.id, user.name status.name
from user
LEFT JOIN daily_status as ds ON (user.id=ds.user_id AND ds.date='24/10/2013')
LEFT JOIN status_types as status ON (ds.status_id=status.id)
WHERE user.department_id=1 and ds.id is null
或试试这个
SELECT user.id, user.name ,'' as statusname
from user
where user.id not in
(select ds.user_id from
daily_status as ds
LEFT JOIN status_types as status ON (ds.status_id=status.id)
WHERE user.department_id=1 and ds.date = '24/10/2013')
答案 3 :(得分:0)
也许我过度简化了这一点,但你只有一条记录具有给定日期24/10/2013所以只有一个可以显示。
如果您在某个特定日期拥有多个商家信息,则可以执行此类操作
SELECT a.id,a.[name],status_types.status_name FROM(SELECT id,[user].[name],department_id,ROW_NUMBER()OVER(PARTITION BY[user].[name]ORDER BY ID DESC)rn FROM[user])a LEFT JOIN daily_status AS ds ON(a.id=ds.user_id)LEFT JOIN status_types ON(ds.status_id=status_types.id)WHERE a.department_id=1AND rn=1AND ds.date='2013-10-23'