Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL查询三个表忽略列中的重复项_Mysql_Select_Duplicates_Multiple Tables - Fatal编程技术网

MySQL查询三个表忽略列中的重复项

MySQL查询三个表忽略列中的重复项,mysql,select,duplicates,multiple-tables,Mysql,Select,Duplicates,Multiple Tables,获得3张表格:个人、技能、文章(个人拥有n项技能,写过n篇文章) (T1)pers 1 John 2 Joe 1 John_sings 1 John_laughs 2 Joe_runs (T2)技能 1 John 2 Joe 1 John_sings 1 John_laughs 2 Joe_runs (T3)文章 1 John_article_1 2 Joe_article_1 3 Joe_article_2 我期望: John - John_

获得3张表格:个人、技能、文章(个人拥有n项技能,写过n篇文章)

(T1)pers

1  John
2  Joe
1  John_sings    
1  John_laughs
2  Joe_runs
(T2)技能

1  John
2  Joe
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
因为我们有两个独立的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
很明显,我不想让“乔·鲁跑”两次,也不想让“约翰·鲁文章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
现在加入这个人,以获得所需的结果

这个问题解释了如何在select中分配列组/行数。

您想要的结果是典型的左连接。你应该做:

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

jcho360-谢谢,您是指按文章/技能ID分组吗?不幸的是,它侵蚀了一篇文章或一项技能。。。(在嵌套的SELECTs中进行了尝试,并在最后对整个查询进行了尝试)您解决了吗?如果没有,您可以在SQLfiddle.com中添加一些信息以允许我们进行一些测试吗?当然:不是通过sql查询解决的,而是通过PHP解决的。但是仍然对sql解决方案感兴趣:-)golimar:恐怕,它提供了旧的副本,谢谢。