2013-10-24 33 views
1

我们有3个不同的表格 即。用户,daily_status,status_types在表如何从多个表格中自定义查询

字段

用户:

id, 
name, 
department_id 

用于用户表中的数据:

u1 jai 1 
u2 singh 1 
u3 test 2 

daily_status:用于daily_

id, 
user_id, 
status_id, 
date 

数据状态表:

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:为status_types表

id, 
status_name, 

数据

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

我的意思是,谁的状态还没有被送入数据库 – user2914828

回答

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

+0

非常感谢你 – user2914828

0

如果你做一个OUTER JOIN,把一个WHERE somethingFromMyLeftJoinedTable = “东西”,你只会得到结果,其中 “东西”存在于LEFT JOINed表中。

为了解决这个问题,你可以任意移动其中date =“XXX”的查询的连接部分这样

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 

希望这有助于。

+0

非常感谢你tillmannen ..它真的帮助。 – user2914828

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') 
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'