1

Got 3 Tables: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”,也不想两次“John_article_1”。

感谢任何建议!

4

2 回答 2

0

为每人的每篇文章和每人的每项技能分配一个行号。

所以现在你的数据就像

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 和 Rank 的文章,它应该给你

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

现在加入这个人以获得所需的结果。

这个 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 回答