Сложный запрос SQL на многие ко многим - PullRequest
1 голос
/ 09 февраля 2012

У меня есть три таблицы в PostgreSQL:

1. product: id, name
2. param: id, name
3. param_product: id, product_id, param_id, value - (!) it's Many to Many

Это проблема с выбранным продуктом, например, с "(param_id = 1 и value = 2000) и (param_id = 2 и value = 1000)"

Как решить эту проблему?

Спасибо.

Ответы [ 4 ]

1 голос
/ 09 февраля 2012

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

SELECT *
FROM product
WHERE     EXISTS (SELECT 1 FROM product_id = product.id AND param_id=1 and value=2000)
      AND EXISTS (SELECT 1 FROM product_id = product.id AND param_id=2 and value=1000)

Кроме того, что касается SQL, это все равно отношение 1-ко-многим.

0 голосов
/ 09 февраля 2012

Если ваши таблицы предназначены для отношений N: M, конечно, у вас будут проблемы с выбором уникальных значений. Самым простым подходом здесь было бы использование функций MIN () или MAX ()

SELECT DISTINCT MAX(product.id)
FROM product
JOIN param_product ON param_product.product_id = product.id
WHERE param_id IN ('1000', '2000')

Я думаю, это должно помочь вам встать на пути.

Кроме того, если продукт уникален для param, вам не нужен столбец «id» в таблице «param_product», вы можете назначить столбцы первичного ключа ON (product_id, param_id), поскольку они, вероятно, должны быть уникальными.

0 голосов
/ 09 февраля 2012

Вы сказали:

(param_id = 1 и значение = 2000) и (param_id = 2 и значение = 1000)

Обратите внимание, что param_id не может быть 1И 2 одновременно :) Попробуйте это вместо:

(param_id=1 and value=2000) OR (param_id=2 and value=1000)

Это даст вам и param_id 1, где значение равно 2000, и param_id 2, где значение равно 1000.

0 голосов
/ 09 февраля 2012

Я могу получить неправильный конец флешки, но разве вам не нужно что-то вроде

    SELECT pr.*
      FROM product pr
INNER JOIN param_product pp ON pr.id = pp.product_id
       AND pa.id = pp.param_id
     WHERE 
           (
           pa.id = 1
           AND pp.value = 2000
           )
        OR
           (
           pa.id = 2
           AND pp.value = 1000
           )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...