私はテーブルからチームリーダーとチームメンバーの完全なリストを取得する方法を試しています。 チームを持たないチームリーダーを含むMySQL - 空の関係を見つける
基本的なデータ構造には、私たちの基本人物オブジェクトを含むテーブルperson
があります。特定の人には、details
テーブルでこのテーブルを拡張します。
私たちが持っている拡張情報の1つにteam_leaderのステータスがあります。この定義には、detail_isTeamLeader
とdetail_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
サンプルデータと望ましい結果は、あなたが持つ問題を伝えるのに役立ちます。 –
personテーブルを拡張する場合、a)詳細テーブルはperson_idを主キーとし、b)personテーブルから常に開始し、そこから左にジョインするか、または右ジョインを使用する必要があります。 – Solarflare
データの例を追加し、 'detail_person'が' person_id'の鍵であることを明らかにしました –