1

我们有 3 张不同的桌子,即。用户、daily_status、status_types

表中的字段

用户:

id,
name,
department_id

用户表的数据:

u1 jai 1
u2 singh 1
u3 test 2

每日状态:

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'

状态类型:

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 表中在该日期没有状态。

4

4 回答 4

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

sqlfiddle demo

于 2013-10-24T09:09:27.127 回答
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

希望这可以帮助。

于 2013-10-24T09:12:18.700 回答
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')
于 2013-10-24T09:14:35.380 回答
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'
于 2013-10-24T18:30:51.047 回答