2012-03-05 17 views
1

JOIN構文を使用する際に、関連付けられた値を持つ行を返す方法を理解しようとしている場合は、NULLの場合はlinksテーブルをチェックしてくださいNULLJOINの場合はそれを使用します。行がNULlの場合はON links.role_id = roles.role_idです。 NULLの場合はpeopleテーブルを使用してください。NULLでない場合は列を選択してから他を選択してください

マイ構文:

SELECT roles.role_name 
FROM 
(
    people_links links 

    LEFT OUTER JOIN people people ON links.person_id = people.person_id 

    LEFT OUTER JOIN roles roles ON links.role_id = roles.role_id OR links.role_id = people.role_id 
) 
基本的に

参加とrole_idON構文を使用しているとき、それはそれはlinksテーブルに依存している必要がありますrole_idから使用されているrolesテーブルから関連する値を返します。 を最初にとした場合、links.role_idNULLであるかどうかを確認し、の場合はpeople.role_id以外の場合はlinks.role_idを返し、role_nameを取得してください。

このクエリを実行すると、先にlinksテーブルを検索するときにpeopleテーブルのrole_idテーブルが最初に使用されます。

私はCOALESCEを使用してみましたが、それはrole_nameを返すべきときにのみ(擬似コード)例えばので、role_idを返します。

SELECT IF(links.role_id IS NOT NULL) links.role_id ELSE people.role_id ENDIF as join_value 
FROM 
(
    people_links links 

    LEFT OUTER JOIN people people ON links.person_id = people.person_id 

    LEFT OUTER JOIN roles roles ON roles.role_id = join_value 
) 
+0

実際、以下の私の答えにもかかわらず - 私は今あなたがしようとしていることを理解していないと思います。期待どおりの結果を得てサンプルデータを表示できますか? – ruakh

答えて

3

あなたあなたの擬似コードに近いことだIF(links.role_id IS NOT NULL, links.role_id, people.role_id) —を書くことができ—しかし、COALESCE(links.role_id, people.role_id)と書くのはもっと慣れています。

IFの詳細については、§11.4 "Control Flow Functions" in the MySQL Reference Manualを参照してください。 COALESCEの詳細については、§11.3.2 "Comparison Functions and Operators"を参照してください。

0

私は、コードの明確さのために、私は役割に2つの結合があると思います。 1つはリンクからロールへ、もう1つは人からロールへ。私。

SELECT 
COALESCE(links_roles.role_name, people_roles.role_name) 
FROM 
(
    people_links links 

    LEFT OUTER JOIN people people ON links.person_id = people.person_id 

    LEFT OUTER JOIN roles link_roles ON links.role_id = link_roles.role_id 

    LEFT OUTER JOIN roles people_roles ON people.role_id = people_roles.role_id 
) 
関連する問題