SQL JOIN 多个表和子查询

时间:2021-01-03 00:22:07

标签: sql join

我正在尝试编写一个查询,该查询会将产品的大小和颜色(如果可用)的值放入列中,或者将“null”放入未定义参数的列中。

[这是我的 BD]1

所有“尺寸”和“颜色”都在“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')

我使用了查询设计器,结果如下:

[查询设计器视图]2

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 中 :(

1 个答案:

答案 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
相关问题