Mysql 如何在更少的查询中高效地为多个列多次连接同一个表?

Mysql 如何在更少的查询中高效地为多个列多次连接同一个表?,mysql,sql,join,left-join,Mysql,Sql,Join,Left Join,我必须在mysql查询中多次连接一个表,我不想对每一列进行左连接。我的表和sql是- 表(mst)- 储物架- SQL- 如何在不使用store\u pick table的多个左联接的情况下执行此操作?不需要所有这些联接,您可以使用如下表达式: SELECT tm.name, MAX(CASE WHEN sp1.pick_id = tm.result1 THEN sp1.pick_name END) AS Result1, MAX(CASE WHEN sp1.pick_id = tm

我必须在mysql查询中多次连接一个表,我不想对每一列进行左连接。我的表和sql是-
表(mst)-

储物架-

SQL-


如何在不使用store\u pick table的多个左联接的情况下执行此操作?

不需要所有这些联接,您可以使用如下表达式:

SELECT
  tm.name,
  MAX(CASE WHEN sp1.pick_id = tm.result1 THEN sp1.pick_name END) AS Result1,
  MAX(CASE WHEN sp1.pick_id = tm.result2 THEN sp1.pick_name END) AS Result2,
  MAX(CASE WHEN sp1.pick_id = tm.result3 THEN sp1.pick_name END) AS Result3
FROM Table_mst as tm
LEFT JOIN store_pick AS sp1  ON sp1.store_id = 'result'
GROUP BY tm.name;
您将得到与原始查询完全相同的结果:

| name | Result1 | Result2 | Result3 |
|------|---------|---------|---------|
|    A |    pass |  supply |  supply |
|    B |    fail |    fail |    fail |
|    C |   grace |   grace |    pass |
|    D |     ufm |  supply |    fail |
|    E |    fail |    fail |    fail |

规范化数据。预期结果是什么?现有查询有什么问题?是的,你好。做什么?我们无法读懂你的心思。请阅读并采取行动。这也是一个常见问题,谷歌我的评论再谷歌问题。像这样使用
CASE
对小表很有效,这是解决这个问题的好方法。我只能补充一点,你可以把它放在一个视图中,以重用代码给读者:这个答案被称为条件聚合,这是一种常用的数据透视(从长到宽)查询数据的方法。
 SELECT
  tm.name,
  sp1.pick_name AS result1,
  sp2.pick_name AS result2,
  sp3.pick_name AS result3,
  sp4.pick_name AS result4
FROM table_mst AS tm
  LEFT JOIN store_pick AS sp1
    ON sp1.pick_id = tm.result1
      AND sp1.store_id = 'result'
  LEFT JOIN store_pick AS sp2
    ON sp2.pick_id = tm.result2
      AND sp2.store_id = 'result'
  LEFT JOIN store_pick AS sp3
    ON sp3.pick_id = tm.result3
      AND sp3.store_id = 'result'
  LEFT JOIN store_pick AS sp4
    ON sp4.pick_id = tm.result4
      AND sp4.store_id = 'result'
SELECT
  tm.name,
  MAX(CASE WHEN sp1.pick_id = tm.result1 THEN sp1.pick_name END) AS Result1,
  MAX(CASE WHEN sp1.pick_id = tm.result2 THEN sp1.pick_name END) AS Result2,
  MAX(CASE WHEN sp1.pick_id = tm.result3 THEN sp1.pick_name END) AS Result3
FROM Table_mst as tm
LEFT JOIN store_pick AS sp1  ON sp1.store_id = 'result'
GROUP BY tm.name;
| name | Result1 | Result2 | Result3 |
|------|---------|---------|---------|
|    A |    pass |  supply |  supply |
|    B |    fail |    fail |    fail |
|    C |   grace |   grace |    pass |
|    D |     ufm |  supply |    fail |
|    E |    fail |    fail |    fail |