MySQL - 通过多个表连接返回引用

时间:2012-01-11 15:39:32

标签: mysql

TABLE 'styles'
id|style_code
1|6110
2|6120
3|6250

TABLE 'colour'
id|colour_code
1|1001
2|1012
3|1033
4|1050

TABLE 'styleColour'
id|style_id|colour_id|cancelled
1 |  1     |  1      |  
2 |  1     |  2      |  y
3 |  2     |  1      |
4 |  2     |  3      |
5 |  2     |  4      |
6 |  3     |  1      |
7 |  3     |  2      |
8 |  3     |  3      |  y
9 |  3     |  4      |  y

TABLE 'orders'
id|style_code|colour_code
1 |  6110    |  1001
2 |  6110    |  1012
3 |  6130    |  1001
4 |  6130    |  1033
5 |  6130    |  1050
6 |  6250    |  1033
7 |  6250    |  1050


Output wanted (based on 'order' table):
style_code|colour_code|cancelled
  6110    |  1001     |  
  6110    |  1012     |  y
  6130    |  1001     |  
  6130    |  1033     |  
  6130    |  1050     |  
  6250    |  1033     |  y
  6250    |  1050     |  y

需要哪些联接才能将“已取消”列引用到“订单”表输出上的相应style_code和colour_code组合?

请注意,尽管显示'style_code'和'colour_code'数据似乎很奇怪,而不是由style_id和colour_id表示,但这是导入原因所必需的。

谢谢和亲切的问候, 德里克。

1 个答案:

答案 0 :(得分:0)

根据以下评论更新答案 -

SELECT orders.style_code,orders.colour_code,styleColour.cancelled
FROM orders
LEFT JOIN colours ON orders.colour_code=colours.colour_code
LEFT JOIN styles ON orders.style_code=styles.style_code
LEFT JOIN styleColour ON styleColour.style_id=styles.id
                      AND styleColour.colour_id=colours.id;

但是,如果您JOIN / colours上的styles位于id列,而不是code列(我假设为{{1}它是主键),它可能更快(因为主键被索引)。

这是我的尝试。我没有测试过,但试一试:

id

全部SELECT orders.style_code,orders.colour_code,styleColour.cancelled FROM styleColour RIGHT JOIN colours ON orders.colour_id=colours.id RIGHT JOIN styles ON orders.style_id=styles.id RIGHT JOIN orders ON orders.style_code=styles.style_code AND orders.colour_code=colours.colour_code; 的原因是根据RIGHT JOIN中的行而不是orders进行所有加入。