我有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
答案 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
<强>样本:强>