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

问题描述 投票:1回答:1

我必须在mysql查询中多次加入一个表,我不想为每一列做左连接。我的表和SQL是 - table_mst-

id  name    result1 result2 result3
1    A       1       3       3
2    B       2       2       2
3    C       4       4       1
4    D       5       3       2
5    E       2       2       2

store_pick-

id  store_id    pick_id pick_name
1   result       1      pass
2   result       2      fail
3   result       3      supply
4   result       4      grace
5   result       5      ufm

SQL-

 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'

如何在不使用store_pick表的多个左连接的情况下执行此操作?

mysql sql join left-join
1个回答
2
投票

不需要所有这些连接,您可以像这样使用CASE表达式:

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 |
© www.soinside.com 2019 - 2024. All rights reserved.