我正在尝试编写一个查询,该查询会将产品的大小和颜色(如果可用)的值放入列中,或者将“null”放入未定义参数的列中。
[这是我的 BD]
所有“尺寸”和“颜色”都在“options_values_translations”表中,并通过 ovalue_id 链接。 从那里我需要尺寸,我可以通过这个查询得到它们:
SELECT
options_values_translations.ovalue_id,
options_values_translations.value
FROM options_values_translations
WHERE options_values_translations.value LIKE '%cm'
和颜色:
SELECT
options_values_translations.ovalue_id,
options_values_translations.value
FROM options_values_translations
WHERE options_values_translations.value IN ('blue', 'pink')
我使用了查询设计器,结果如下:
[查询设计器视图]
SELECT
products.product_id AS ID,
SUBSTRING_INDEX (products_stock.code, "_", -1) AS tw_symbol,
size.value AS Size,
colour.value AS Colour
FROM products
INNER JOIN products_stock
ON products_stock.product_id = products.product_id
INNER JOIN options_stock_values
ON options_stock_values.stock_id = products_stock.stock_id
LEFT OUTER JOIN (SELECT
options_values_translations.ovalue_id,
options_values_translations.value
FROM options_values_translations
WHERE options_values_translations.value LIKE '%cm') size
ON options_stock_values.ovalue_id = size.ovalue_id
LEFT OUTER JOIN (SELECT
options_values_translations.ovalue_id,
options_values_translations.value
FROM options_values_translations
WHERE options_values_translations.value IN ('blue', 'pink')) colour
ON options_stock_values.ovalue_id = colour.ovalue_id
WHERE products_stock.active = 1
AND products_stock.code REGEXP '^[0-9]*_[0-9a-zA-Z/ ]*$'
AND products.product_id IN (244, 2107)
ORDER BY ID
注意:ID 为 244、2107 的产品只是测试产品 :) 所以请不要关注 WHERE 子句。
结果如下:
ID tw_symbol Size Colour
-------- ------------ ------------- ----------
244 X3 13x18 cm NULL
244 X0 NULL blue
244 X1 NULL pink
244 X2 NULL blue
244 X3 NULL pink
244 X0 9x13 cm NULL
244 X1 9x13 cm NULL
244 X2 13x18 cm NULL
2107 VR 17029 8.5 cm NULL
2107 VR 17028 6.5 cm NULL
我的预期结果如下:
ID tw_symbol Size Colour
-------- ------------ ------------- ----------
244 X3 13x18 cm pink
244 X0 9x13 cm blue
244 X1 9x13 cm pink
244 X2 13x18 cm blue
2107 VR 17029 8.5 cm NULL
2107 VR 17028 6.5 cm NULL
简单地说......我只需要每个 tw_symbol 一行。
ID 为 244 的产品确实定义了颜色和尺寸。
ID 为 2107 的产品确实有尺寸,但没有颜色。
还有一些没有颜色和大小的产品,我希望在列大小和颜色中设置 2x null。
以下查询正确显示产品 244,但根本不显示 2107:
SELECT
products.product_id AS ID,
SUBSTRING_INDEX (products_stock.code, "_", -1) AS tw_symbol,
size.value AS Size,
colour.value AS Colour
FROM products
INNER JOIN products_stock
ON products_stock.product_id = products.product_id
INNER JOIN options_stock_values
ON options_stock_values.stock_id = products_stock.stock_id
INNER JOIN (SELECT
options_values_translations.ovalue_id,
options_values_translations.value
FROM options_values_translations
WHERE options_values_translations.value LIKE '%cm') size
ON options_stock_values.ovalue_id = size.ovalue_id
INNER JOIN options_stock_values options_stock_values_1
ON options_stock_values_1.stock_id = products_stock.stock_id
INNER JOIN (SELECT
options_values_translations.ovalue_id,
options_values_translations.value
FROM options_values_translations
WHERE options_values_translations.value IN ('blue', 'pink')) colour
ON options_stock_values_1.ovalue_id = colour.ovalue_id
WHERE products_stock.active = 1
AND products_stock.code REGEXP '^[0-9]*_[0-9a-zA-Z/ ]*$'
AND products.product_id IN (244, 2107)
ORDER BY ID
有人可以更正我的主要查询以提供我预期的结果吗? 我完全迷失在 JOIN 中 :(
答案 0 :(得分:0)
您需要 group by
如下:
SELECT
products.product_id AS ID,
SUBSTRING_INDEX (products_stock.code, "_", -1) AS tw_symbol,
Max(size.value) AS Size,
Max(colour.value) AS Colour
FROM products
INNER JOIN products_stock
ON products_stock.product_id = products.product_id
INNER JOIN options_stock_values
ON options_stock_values.stock_id = products_stock.stock_id
LEFT OUTER JOIN (SELECT
options_values_translations.ovalue_id,
options_values_translations.value
FROM options_values_translations
WHERE options_values_translations.value LIKE '%cm') size
ON options_stock_values.ovalue_id = size.ovalue_id
LEFT OUTER JOIN (SELECT
options_values_translations.ovalue_id,
options_values_translations.value
FROM options_values_translations
WHERE options_values_translations.value IN ('blue', 'pink')) colour
ON options_stock_values.ovalue_id = colour.ovalue_id
WHERE products_stock.active = 1
AND products_stock.code REGEXP '^[0-9]*_[0-9a-zA-Z/ ]*$'
AND products.product_id IN (244, 2107)
Group by products.product_id,
SUBSTRING_INDEX (products_stock.code, "_", -1)
ORDER BY ID