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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 18 января 2011

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

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 голосов
/ 18 января 2011

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

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