Mysql отношения "многие-к-одному" для вариантов продукта? - PullRequest
0 голосов
/ 16 января 2012

Мне трудно понять, как это сделать.Я делаю таблицу «Варианты продукта», которая будет содержать все возможные варианты продукта на основе прикрепленных атрибутов.Таким образом, если к продукту прикреплены красный, маленький, синий и большой, можно выбрать маленький красный, большой красный, маленький синий и большой синий.Для этого я предполагаю, что мне нужно изменить один ко многим, но я борюсь с тем, как.

Сейчас я пытаюсь получить параметр, который соответствует указанным значениям.Так, например, если я буду искать красный и маленький, он даст мне вариант «маленький красный».Это то, что я пытался, основываясь на предыдущем вопросе Я спросил:

SELECT o.name
FROM shop_products_options o
WHERE o.id IN (
    SELECT v.option_id
    FROM shop_products_options_values v
    WHERE v.product_id = 1 AND v.value_id IN(4,7)
    GROUP BY v.option_id
)

Это возвращает все опции, которые соответствуют 4 или 7 (идентификаторы для маленьких и красных значений)только раз.Как я могу заставить его возвращать только значения option_id, которые точно соответствуют и 4 и 7?

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

1 Ответ

0 голосов
/ 16 января 2012

Если я не понял неправильно, попробуйте что-то вроде этого.Найдите все option_id для 4, а затем для 7 и используйте INTERSECT, чтобы вернуть только те значения, которые существуют для обоих.

SELECT o.name
FROM shop_products_options o
WHERE o.id IN (
SELECT v.option_id
FROM shop_products_options_values v
WHERE v.product_id = 1 AND v.value_id = 4
GROUP BY v.option_id

INTERSECT

SELECT v.option_id
FROM shop_products_options_values v
WHERE v.product_id = 1 AND v.value_id = 7
GROUP BY v.option_id
)

Примечание. INTERSECT не поддерживается в MySQL, поэтому в качестве альтернативы можно использоватьнесколько подзапросов

SELECT o.name
FROM shop_products_options o
WHERE o.id IN (
SELECT v.option_id
FROM shop_products_options_values v
WHERE v.product_id = 1 AND v.value_id = 4
GROUP BY v.option_id
)

AND o.id IN (
SELECT v.option_id
FROM shop_products_options_values v
WHERE v.product_id = 1 AND v.value_id = 7
GROUP BY v.option_id
)

Часть GROUP BY может не потребоваться

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...