Как исправить значения имени столбца в запросе MySQL multiple JOINS - PullRequest
0 голосов
/ 08 мая 2020

Мне нужно отобразить продукт с его ценой и текущим запасом (если есть) этого продукта с указанным c цветом и атрибутами. Он делает то, что должен, частично. Это объяснение запроса (или, по крайней мере, то, что он должен делать):

  • Получить основную c информацию о продукте из store_product
  • Продукт имеет акции. Этот запас связан с идентификатором цвета и идентификатором детали атрибута.
  • Товар, связанный с идентификатором цвета, может иметь несколько идентификаторов деталей атрибута. Так, например, стоимость запаса красной рубашки из полиэфирного материала может отличаться от стоимости запаса красной рубашки размера M.

Для этого конкретного примера я пытаюсь получить стоимость запаса для продукта Идентификатор 59, который соответствует этим спецификациям c значения

  • id_color должен быть 1 (1 = красный , имеющий настраиваемое имя красный deadpool )
  • id_detail должно быть 4 в одном ряду, а 50 в другом (4 = Размер M / 50 = Материал Полиэстер )

Вот что я сейчас получаю:

current result

Запрос частично правильно, потому что:

  • Я получаю 2 строки, по одной для каждой комбинации цвета / атрибута
  • Я получаю правильный id_stock ID для каждой строки, и я также получение правильного значения запаса для комбинации цвета / атрибута.

Проблема в том, что, хотя информация о запасе верна, id_attribute / attribute / * 10 54 * / detail неверная информация.

Это то, что мне нужно для получения (исправление выделено жирным шрифтом):

corrected result

SELECT store_product.id_product             AS id_product, 
       store_product.NAME                   AS NAME, 
       store_product.price                  AS price, 
       store_product.flg_stock              AS flg_stock, 
       store_product_stock.id               AS id_stock, 
       store_product_stock.stock            AS stock, 
       Ifnull(store_color.NAME, color.NAME) AS color, 
       color.hex                            AS hex, 
       store_attribute.id_attribute         AS id_attribute, 
       store_attribute.NAME                 AS attribute, 
       store_attribute_detail.id_detail     AS id_detail, 
       store_attribute_detail.NAME          AS detail 
FROM   store_product 
       LEFT JOIN store_product_color 
              ON store_product_color.id_color = store_product_color.id_color 
       LEFT JOIN color 
              ON color.id_color = store_product_color.id_color 
       LEFT JOIN store_color 
              ON store_color.id_color = color.id_color 
                 AND store_color.id_store = 1 
       LEFT JOIN store_product_detail 
              ON store_product_detail.id_product = store_product.id_product 
       LEFT JOIN store_attribute_detail 
              ON store_attribute_detail.id_detail = 
                 store_product_detail.id_detail 
       LEFT JOIN store_attribute 
              ON store_attribute.id_attribute = 
                 store_attribute_detail.id_attribute 
       LEFT JOIN store_product_stock 
              ON store_product_stock.id_product = store_product.id_product 
                 AND store_product_stock.id_color = 1 
                 AND store_product_stock.id_detail IN( 4, 50 ) 
WHERE  store_product.id_store = 1 
       AND store_product.id_product = 59 
       AND store_product_color.id_color = 1 
GROUP  BY store_product_stock.id 

Здесь вы можете найти всю структуру таблицы и текущий запрос, в котором возникла проблема: sqlfiddle

Любые идеи о том, как решать проблему? Спасибо!

1 Ответ

1 голос
/ 08 мая 2020

Как вы упомянули:

Товар имеет запас. Этот запас связан с идентификатором цвета и идентификатором детали атрибута.

В вашем запросе ваш продукт напрямую связан с вашими color_id и attribute_detail. Вы связываете свои атрибуты непосредственно с вашим store_product, а не с вашим color/stock.

Это означает, что ваш id_attribute и атрибут зависят только от store_product.id_product, но не от store_product_stock.id

EDIT Во-первых, спасибо за sqlfiddle. Чтобы связать ваши акции и детали, используйте store_attribute_detail.id_detail = store_product_stock.id_detail

FROM   store_product 
       LEFT JOIN store_product_color 
              ON store_product_color.id_color = store_product_color.id_color 
       LEFT JOIN color 
              ON color.id_color = store_product_color.id_color 
       LEFT JOIN store_color 
              ON store_color.id_color = color.id_color 
                 AND store_color.id_store = 1 

       LEFT JOIN store_product_stock 
              ON store_product_stock.id_product = store_product.id_product 
                 AND store_product_stock.id_color = 1 
                 AND store_product_stock.id_detail IN( 4, 50 ) 

       LEFT JOIN store_attribute_detail 
              ON store_attribute_detail.id_detail = 
                 store_product_stock.id_detail 
       LEFT JOIN store_attribute 
              ON store_attribute.id_attribute = 
                 store_attribute_detail.id_attribute 
        LEFT JOIN store_product_detail 
              ON store_product_detail.id_product = store_product.id_product 
+------------+--------------------------+-------+-----------+----------+-------+--------------+--------+--------------+-----------+-----------+-----------+
| id_product |           NAME           | price | flg_stock | id_stock | stock |    color     |  hex   | id_attribute | attribute | id_detail |  detail   |
+------------+--------------------------+-------+-----------+----------+-------+--------------+--------+--------------+-----------+-----------+-----------+
|         59 | Camiseta Júbilo de X-men |  55.1 |         1 |      112 |     5 | red deadpool | f44336 |            1 | Size      |         4 | M         |
|         59 | Camiseta Júbilo de X-men |  55.1 |         1 |      118 |    35 | red deadpool | f44336 |            8 | Material  |        50 | Poliester |
+------------+--------------------------+-------+-----------+----------+-------+--------------+--------+--------------+-----------+-----------+-----------+
...