1

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 -

結果はクエリごとに良好ですが、その部門のすべてのユーザーの詳細が表示されるように再構成する必要があります。

4

4 に答える 4

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

単純化しすぎたかもしれませんが、2013 年 10 月 24 日の指定された日付を持つレコードは 1 つしかないため、表示できるレコードは 1 つだけです。

特定の日付に複数のリストがある場合は、次のようにすることができます

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 に答える
0

日付の検証をオンに移動します。

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 JOIN されたテーブルに "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 に答える