правильное использование подзапросов с MySQL - PullRequest
0 голосов
/ 14 января 2011

У меня есть 3 таблицы в моей БД: product (id, sku, type, price), product_relation (parent_id, child_id) и product_stock (product_id, quantity, in_stock).Возможны отношения между продуктами: Продукт типа X может быть родительским (может состоять из) для нескольких продуктов типа Y (отношение хранится в таблице product_relation).В продуктах БД типа X всегда есть количество, установленное в 0. Теперь вот что дело.Мне нужно получить только продукты (sku и id) типа X, которые есть в наличии (in_stock = true), и хотя бы у одного из их детей есть quantity > 0 или in_stock = true.

Я застрял на этом на несколько часов.Я не могу сделать хороший запрос для этого.Самый близкий, который я достиг, -


SELECT a.`id`, a.`sku` FROM `product` AS a 
INNER JOIN `product_stock` AS b 
ON a.`id` = b.`product_id`
INNER JOIN `product_relation` AS c 
ON c.`child_id` = b.`product_id` 
WHERE b.`in_stock` = 1 AND a.`type` = 'X'

, но это не хорошо, потому что многие элементы отсутствуют.Я не знаю, может ли это быть обработано только объединениями, или у подзапросов есть Помощь, пожалуйста.

Ответы [ 2 ]

3 голосов
/ 14 января 2011

Я не совсем уверен, что понял, о чем вы спрашивали;это помогает?

SELECT a.id, a.sku 
FROM product AS a 
    INNER JOIN product_stock AS b  ON a.id = b.product_id
WHERE b.in_stock = 1 AND a.type = 'X'
and exists (
    SELECT 'EXISTS'
    FROM product d
        INNER JOIN product_relation AS c ON c.child_id = d.product_id
    WHERE 
        c.product_id = a.product_id
        AND (d.quantity > 0 or d.in_stock = true)

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

Вам не нужен подзапрос, если он вам не нужен.Преимущество здесь в том, что если вы хотите узнать, какие дети удовлетворяют критериям, вы можете просто добавить его поля в предложение select.

SELECT DISTINCT parent.`id`, parent.`sku`


FROM
`product` parent as parent
INNER JOIN `product_relation` AS c 
ON c.`parent_id` = b.`product_id` 
INNER JOIN `product_stock` AS parent_stock
ON p.`product_id` = parent_stock.`product_id`    
INNER JOIN `product` as child 
ON c.`child_id` = child.`product_id`
INNER JOIN `product_stock` AS child_stock
ON c.`product_id` = child_stock.`product_id`    

WHERE parent_stock.`in_stock` = 1
    and (child_stock.`in_stock` = 1 or child_stock.`quantity`> 0)
    and  parent.`type` = 'X'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...