2016-09-22 6 views
0

私はテーブルからチームリーダーとチームメンバーの完全なリストを取得する方法を試しています。 チームを持たないチームリーダーを含むMySQL - 空の関係を見つける

基本的なデータ構造には、私たちの基本人物オブジェクトを含むテーブルpersonがあります。特定の人には、detailsテーブルでこのテーブルを拡張します。

私たちが持っている拡張情報の1つにteam_leaderのステータスがあります。この定義には、detail_isTeamLeaderdetail_teamLeaderという2つの関連する詳細があります。 最初はブール値で、チームリーダーの短いリストを定義します。 2番目は、チームリーダーが誰であるか(理想的にはサブセットから)を定義します。

_person table_ 
person_id 
person_name 

_detail table_ 
detail_id 
detail_person_id 
detail_isTeamLeader 
detail_teamLeader 

は、私は次のクエリを使用してチームを持って、すべてのチームリーダーを取得することができます。

SELECT tl.person_id AS tlref, tl.person_name AS tlname, 
per.person_id AS perref, per.person_name AS pername 
FROM detail 
LEFT OUTER JOIN person AS per ON detail.person = per.person_id 
LEFT OUTER JOIN person AS tl ON detail_teamleader = tl.person_id 
ORDER BY tlname, psname 

しかし、これはdetail.isTeamLeaderが真であるが、detail_teamLeaderフィールドに存在しないものをteam_leadersのために失敗しました。ジョーとフレッド上記の例では

サンプルデータ

person_id person_name 
1   Joe Bloggs 
2   Fred Smith 
3   Frank Jones 
4   Amy Kelly 

detail_id detail_person_id detail_isTeamLeader detail_teamLeader 
1   1     1      0 
2   2     1      0 
3   3     0      3 
4   4     0      3 

チームリーダーです。しかし、ジョーはチームに誰もいないので、上記のクエリでは結果セットから除外されます。

私は、データ構造を正規化することが最良の答えかもしれないと思っていますが、これを行わない方法がありますか?私はあなたに1を持っていることを理解し

SELECT 
    person_id, person_name 
FROM 
    person 
LEFT JOIN 
    detail 
ON 
    person.person_id = detail.person 
WHERE 
    detail.detail_isTeamLeader = 1 
+0

サンプルデータと望ましい結果は、あなたが持つ問題を伝えるのに役立ちます。 –

+1

personテーブルを拡張する場合、a)詳細テーブルはperson_idを主キーとし、b)personテーブルから常に開始し、そこから左にジョインするか、または右ジョインを使用する必要があります。 – Solarflare

+0

データの例を追加し、 'detail_person'が' person_id'の鍵であることを明らかにしました –

答えて

1

+0

最初は本当に必要なものです。助けてくれてありがとう! –

0

あなたはテーブルからすべてのチームリーダーとすべてのレコードは、「人は」テーブルに 対応するレコードを持っているに「詳細」を必要とする場合、私はあなたがこのコードを使用することができると思います1人の関係と詳細の間には関係がありますが、すべての人が詳細情報を持っているわけではありません

チームのすべての人(チームを持たない人も含む)を持つチームリーダーだけを取得するか、チームリーダーの情報を持つすべての人物を含むデータセットが必要なのかどうかはわかりません。

最初のケースでは、インナーセレクト(またはSQLサーバーでCTE)を使用して、すべてのチームリーダーを選択し、詳細および人物表と結合する必要があります。ここでは、使用できるクエリです:

後者の場合については
select tl.person_id as tlref, tl.name as tlname, p.person_id as perref, p.name as pername 
from (
     select p.person_id,p.name 
     from @persons p 
     inner join @details d on d.person_id = p.person_id and d.is_temamleader = 1 
) tl 
left outer join @details d on d.team_leader = tl.person_id 
left join @persons p on p.person_id = d.person_id 

(チームリーダー情報をすべての人を取得):

select p.person_id as perref, p.name as pername, d.is_teamleader, pTl.person_id as tlref, ptl.name as tlname 
from @persons p 
left outer join @details d on d.person_id = p.person_id 
left outer join @persons pTl on pTl.person_id = d.team_leader 

私は最初のクエリはあなたが求めていたが、私は追加するものである疑いがありますあなたがそれを必要とする場合に備えて2番目のもの。テーブル変数(@persons、@details)を使用しているので、実際のテーブル名と置き換えてください。

関連する問題