2013-10-24 74 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'