mysql - SQL JOIN 在单列中返回两个表

标签 mysql sql

如何执行 SQL JOIN 并在单个列中返回两个表?

例如,对于给定的组 ID,我如何获得属于该组的所有人及其所有 friend 的单个列表?

团体

-id
-name

groups_have_people

-groups_id
-people_id

-id
-name
-group_id

people_have_friends

-people_id1 (references people.id)
-people_id2 (references people.id)

例如,groups_have_people 包括组 123 的 people_id 1、2 和 3,people_have_friends 包括记录 1-2 , 1-3, 1-4, 2-1, 2-5, 我应该得到以下结果:

id Name
1  Mary
2  John
3  Burt
4  Jill
5  Sue

我可以做类似下面的事情,但它不会返回一个列表。

SELECT p1.*, p2.*
FROM people p1
INNER groups_have_people ghp ON ghp.people_id=p1.id
LEFT OUTER JOIN people_have_friends phf ON p1.id=phf.people_id1
LEFT OUTER JOIN people p2 ON p2.id=phf.people_id2
WHERE ghp.groups_id=123;

编辑 看起来我可能不使用 JOIN 来这样做,应该做类似下面的事情吗?

SELECT p.*
FROM people p
INNER groups_have_people ghp ON ghp.people_id=p.id
WHERE ghp.groups_id=123
UNION
SELECT people p1
INNER JOIN people_have_friends phf ON p1.id=phf.people_id1
INNER JOIN people p2 ON p2.id=phf.people_id2
WHERE p2.groups_id=123;

编辑 2. 添加更多样本数据

团体

id  name
111 Green
123 Blue
222 Yello

id Name
1  Mary
2  John
3  Burt
4  Jill
5  Sue
6  Bob
7  Wilma

groups_have_people

groups_id  people_id
111        1
111        5
123        1
123        2
123        3
222        3
222        7

people_have_friends

people_id1  people_id2
1           2
1           3
1           4
2           1
2           5
4           5
5           6

编辑 3. 像下面这样的东西怎么样?

SELECT DISTINCT id,
                name
FROM people
WHERE id IN
    ( SELECT people_id
     FROM groups_have_people
     WHERE groups_id=123
     UNION SELECT phf.people_id
     FROM people_have_friends phf
     INNER JOIN groups_have_people ghp ON ghp.people_id=phf.people_id
     WHERE ghp.groups_id=123);

SELECT DISTINCT id,
                name
FROM people
INNER JOIN
  (SELECT people_id
   FROM groups_have_people
   WHERE groups_id=123
   UNION SELECT phf.people_id
   FROM people_have_friends phf
   INNER JOIN groups_have_people ghp ON ghp.people_id=phf.people_id
   WHERE ghp.groups_id=123) x ON x.people_id=people.id;

最佳答案

http://sqlfiddle.com/#!9/89a12/3

SELECT 
  p.id,
  p.name
FROM groups_have_people ghp
INNER JOIN people p 
ON ghp.people_id=p.id
WHERE ghp.groups_id=123
UNION
SELECT 
  p.id,
  p.name
FROM groups_have_people ghp
INNER JOIN people p_temp 
ON ghp.people_id=p_temp.id
INNER JOIN people_have_friends phf 
ON p_temp.id=phf.people_id1
INNER JOIN people p 
ON phf.people_id2=p.id
WHERE ghp.groups_id=123

关于mysql - SQL JOIN 在单列中返回两个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37601060/

相关文章:

php - 限制表单提交率

PHP在线购物商店

java sql连接

mysql - 如何插入其他表中的值?

python - 按排序顺序检索 sqlalchemy 关系对象

php - MySQL 语法 :You have an error in your SQL syntax…

mysql - 创建索引锁 MySQL 5.6 表。如何避免这种情况?

sql 减去日期

mysql - 同一查询重复执行时返回不同的值

sql - 我重命名了我的列以包含表名。为什么我不能重命名它了?