mysql - 秒级基于多列连接表

mysql - Join tables based on multiple columns in second

我有两个表 Place 和 Post 我需要生成输出

place
--------------
std_id  sch_id
1       1
2       2
3       1
4       3
5       4
6       2
7       5
8       3
9       5
10      4

Post
------------
sch1_id  sch2_id  sch3_id  sup_id
1        2        3        1
3        2        4        2

我需要生成以下输出

sup_id  sch_id  std_id
1       1       1
1       1       3
1       2       2
1       2       6
1       3       4
1       3       8
2       3       4
2       3       8
2       2       2
2       2       6
2       4       5
2       4       10

我试过了

 SELECT pl.std_id,po.sup_id FROM `place` pl,`post` po WHERE pl.sch_id =
 po.sch1_id group by po.sup_id

得到这个

| std_id | sup_id |
|--------|--------|
|      1 |      1 |
|      4 |      2 |

编辑

SQLFiddle

您可以尝试 'un-pivoting' table post 使用 UNION ALL:

SELECT pl.std_id, po.sch_id, po.sup_id
FROM `place` pl
JOIN (
   SELECT sch1_id AS sch_id, sup_id
   FROM `post`

   UNION ALL

   SELECT sch2_id AS sch_id, sup_id
   FROM `post`

   UNION ALL

   SELECT sch3_id AS sch_id, sup_id
   FROM `post`

   UNION ALL

   SELECT sch4_id AS sch_id, sup_id
   FROM `post`
) AS po ON pl.sch_id = po.sch_id 

只需使用 IN() :

SELECT pl.std_id,pl.sch_id,po.sup_id
FROM `place` pl
INNER JOIN `post` po
 ON(pl.sch_id IN(po.sch1_id,po.sch2_id,po.sch3_id))

虽然非常推荐,但无需对数据进行归一化!!您应该重新考虑您的 table 结构。

您似乎想要形成匹配任何 sch* 值的联接,如果是这样,那么一种方法是在联接中使用多个条件:

select sup_id, sch_id, std_id
from post p
join place pl on pl.sch_id = p.sch1_id 
              or pl.sch_id = p.sch2_id 
              or pl.sch_id = p.sch3_id