1

3 つのテーブルを取得: pers、skills、articles (人はn 個のスキルを持ち、n 個の記事を書きました)

(T1) 人

1  John
2  Joe

(T2) スキル

1  John_sings    
1  John_laughs
2  Joe_runs

(T3)記事

1  John_article_1
2  Joe_article_1
3  Joe_article_2

私が期待する:

John - John_laughs - John_article_1
John - John_sings  - [NULL]
Joe  - Joe_runs    - Joe_article_1
Joe  - [NULL]      - Joe_article_2

2 つの別個の 1:n リレーションがあるため、この質問によると、T1 x T2 x T3 ではなく、(T1 x T2) x (T1 x T3) ではなく、連続した結合では実行できません。

私はもう試した:

SELECT child1.id,
       child1.name,
       child1.skill,
       child2.title
FROM
  (SELECT pers.id,
          pers.name,
          skills.skill
   FROM pers
   LEFT JOIN skills ON pers.id = skills.pers_id) child1
INNER JOIN
  (SELECT pers.id,
          article.title
   FROM pers
   LEFT JOIN article ON pers.id = article.pers_id) child2 ON child1.id = child2.id

しかし、これは示しています

John - John_laughs - John_article_1
John - John_sings  - John_article_1
Joe  - Joe_runs    - Joe_article_1
Joe  - Joe_runs    - Joe_article_2

明らかに、"Joe_runs" を 2 回も "John_article_1" を 2 回も使用したくありません。

任意の提案に感謝します!

4

2 に答える 2

0

1 人あたりの各記事と 1 人あたりの各スキルに行番号を割り当てます。

だから今あなたのデータは次のようになります

T1) pers
PId Name
1   John

2   Joe

(T2) skills
PId Skill      Rank

1   John_sings   1

1   John_laughs  2

2   Joe_runs     1

(T3) article
PId Article        Rank
1   John_article_1 1
2   Joe_article_1  1 
2   Joe_article_2  2

Pid とランクに関する完全なアウター ジョイン スキルと記事が追加されました。

PID   Skill       Article
1     John_Sings  john_Article_1
1     John_Laughs Null
2     Joe_runs    Joe_article_1
2     Null        Joe_Article_2

これを person と結合して、目的の結果を取得します。

This SO question は、選択でランク/行番号を割り当てる方法を説明しています。 MySQL - 選択時に行番号を取得

于 2012-08-02T15:08:11.057 に答える
0

必要な結果は、典型的な LEFT JOIN です。やったほうがいい:

SELECT * FROM T1
LEFT JOIN T2 on (T1.id=T2.id)
LEFT JOIN T3 on (T1.id=T3.id);

これは 2 つの個別の 1:n 関係と互換性があります。これは T1-T2 と T1-T3 を結合することに注意してください。

于 2012-08-02T15:12:54.183 に答える