LEFT JOIN有多行结果

时间:2015-11-02 12:20:19

标签: php mysql

我有3个表产品,颜色,分配这个结构:

产品:

product_id | default_color
1          | 1

颜色

color_id | color_name
1        | Black
2        | Green
3        | Yellow

指定

product_id | color_id
1          | 1
1          | 2
1          | 3 

我的查询只返回“assign”表的第一行,我需要为当前产品分配所有颜色。

这是我使用的查询:

SELECT * FROM products p
LEFT JOIN assign a ON p.product_id = '1' 
LEFT JOIN colors c ON a.color_id = c.color_id
WHERE p.product_id = 1

4 个答案:

答案 0 :(得分:1)

试试这个:

SELECT * FROM products p
LEFT JOIN assign a ON a.product_id = p.product_id
LEFT JOIN colors c ON c.color_id = a.color_id
WHERE p.product_id = 1

join条件应该在列名上进行,而不是在值上进行 要过滤结果,请使用where

请在此处查看工作sqlFiddle

有关join的详情,请参阅官方文档here

答案 1 :(得分:0)

而不是p.product_id = '1'使用a.product_id

SELECT * FROM products p
LEFT JOIN assign a ON p.product_id = a.product_id 
LEFT JOIN colors c ON a.color_id = c.color_id
WHERE p.product_id = 1`

答案 2 :(得分:0)

您的SQL语句似乎列出了System.currentTimeMillis()表中的所有三行。

我执行了你的查询:

assign

我得到了三行SELECT * FROM products p LEFT JOIN assign a ON p.product_id = '1' LEFT JOIN colors c ON a.color_id = c.color_id WHERE p.product_id = 1 表。

这是我的SQLFiddle:http://sqlfiddle.com/#!9/50f8bd/1/0

答案 3 :(得分:0)

尝试此查询。除了我使用GROUP_CONCAT()函数将给定产品的所有颜色合并到一个字段中之外,所有内容都与您的相同。

SELECT
  p.product_id,
  GROUP_CONCAT(c.color_name ORDER BY c.color_name ASC SEPARATOR ', ') AS colors
FROM products p
LEFT JOIN assign a ON a.product_id = p.product_id
LEFT JOIN colors c ON c.color_id = a.color_id
WHERE p.product_id = 1

<强>结果:

product_id | colors
-----------|-------------
1          | Black, Green, Yellow

<强>样本:

http://sqlfiddle.com/#!9/50f8bd/6