Как вернуть все из одной таблицы в отношении один-ко-многим, даже если один-к-одному с MySQL

0

Проведя несколько месяцев, размышляя над тем, как я собирался собирать таблицы "JOIN", которые разделяют одинаковые столбцы и выводят их в формате, который можно искать и вызывать, я придумал это решение, в котором он создает "столбец", с именем набора, например stock_levels, и вводит значения как JSON, чтобы впоследствии его можно было разобрать.

Это работает точно так же, как и предполагалось, однако проблема, которую я выбрал, - это раздел "WHERE", (product. id= quantity. product_id) возвращает все элементы в quantity, которые идентификатор продукта, однако, если в нем есть любые элементы из quantity с этим идентификатором продукта, сам продукт не возвращается, так как новые продукты, введенные в систему, не имеют никакого запаса или изображений, они не возвращаются системой.

Мой вопрос, таким образом, есть способ в основном делать это (но с кодом c, который работает)

WHERE ( `product`.`id` = `quantity`.`product_id` OR COUNT( `product`.`id` = `quantity`.`product_id` ) = 0 )

(т.е. вернуть продукт, если он не имеет записей в количестве)

И вот код используемого запроса:

SELECT DISTINCT `product`.*, 
CONCAT( '[', GROUP_CONCAT( '{', '"id":"', `quantity`.`id`, '"', ',', '"sku":"', `quantity`.`sku`, '"', ',', '"product_id":"', `quantity`.`product_id`, '"', ',', '"criteria":"', `quantity`.`criteria`, '"', ',', '"quantity":"', `quantity`.`quantity`, '"', ',', '"price":"', `quantity`.`price`, '"', '}' SEPARATOR ',' ), ']' ) as `stock_levels`, 
CONCAT( '[', GROUP_CONCAT( '{', '"id":"', `product_image`.`id`, '"', ',', '"product_id":"', `product_image`.`product_id`, '"', ',', '"location":"', `product_image`.`location`, '"', ',', '"type":"', `product_image`.`type`, '"', ',', '"order":"', `product_image`.`order`, '"', '}' SEPARATOR ',' ), ']' ) as `images`
FROM (`product`, `quantity`, `product_image`)
WHERE ( `product`.`id` = `quantity`.`product_id` ) 
AND ( `product`.`id` = `product_image`.`product_id` ) 
AND `online` = 1
GROUP BY `product`.`id`
ORDER BY date_added desc
Теги:
one-to-many

2 ответа

0
Лучший ответ

Вы хотите преобразовать свои внутренние соединения в Left Joins

FROM
 product p
 LEFT JOIN quantity q
 ON p.id = q.product_id
 LEFT JOIN product_image pi
 ON p.id = pi.product_id 
WHERE
 p.online = 1

Это предполагает, что он-лайн находится в таблице продуктов, если его не нужно переместить в JOIN.

Также вы должны использовать ANSI 92 в любом случае

  • 0
    Работает шарм, я не знаком с ANSI 92 JOINS, это то, что я должен использовать соединения или они являются их конкретной вариацией.
0

Я думаю, что вы хотите, чтобы в таблицу количества осталось левое внешнее соединение... Это означает, что любая запись в таблице в левой части соединения будет ВСЕГДА включаться вне зависимости от соответствия правой стороне соединения..

select ...
     from product left outer join quantity
           on product.id = quantity.product_id,
          product_image
     where 
          product.id = product_image.product_id

Ещё вопросы

Сообщество Overcoder
Наверх
Меню