Дублируйте строки с помощью SELECT и WHERE IN - PullRequest
0 голосов
/ 31 января 2020

У меня проблема с построением запроса, который бы дал мне уникальные строки. Ситуация такова:

У меня есть такой TABLE продукт:

id   name    price
==================
1    bolt    50
2    screw   4
3    hammer  40
4    drill   30

и TABLE products2tags вроде этого:

id   id_product  id_tag
=======================
1    1           1
2    2           1
3    2           2
4    2           3
5    3           3

В моем приложении я рендеринг список всех имеющихся продуктов, и я создаю фильтр, в котором пользователь должен иметь возможность выбрать ноль или несколько тегов и получить список всех продуктов, которым присвоен тег (есть строка с этим идентификатором продукта и идентификатором тега в таблице products2tags).

Запрос

SELECT *
FROM products AS p
   JOIN products2tags AS p2t
      ON p.id = p2t.id_product
   WHERE IN p2t.id_tag in (1, 3);

работает, когда я выбираю только один тег в моем фильтре (поэтому в операторе WHERE есть один идентификатор тега. Когда я выбираю больше тегов Я все еще получаю результат, но я получаю несколько строк несколько раз - те, которым назначено несколько тегов.

Все, что мне нужно, - это получать уникальные строки при выборе более одного тега.

РЕДАКТИРОВАТЬ:

Ожидаемый результат запроса из таблиц выше:

p.id   p.name   p.price   p2t.id   p2t.id_product   p2t.id_tag
==============================================================
1      bolt     50        1        1                1
2      screw    4         2        2                1         (only once)
4      drill    30        5        4                3

Ответы [ 3 ]

1 голос
/ 31 января 2020

Это происходит потому, что вы включаете теги в свой набор результатов. Попробуйте

SELECT DISTINCT
    product.*
FROM products AS p
   JOIN products2tags AS p2t
      ON p.id = p2t.id_product
   WHERE IN p2t.id_tag in (3, 4);
0 голосов
/ 01 февраля 2020

Использовать отличные на p.id.

select distinct on (p.id) *
from products as p
   join products2tags as p2t
      on p.id = p2t.id_product
   where p2t.id_tag in (1, 3);
0 голосов
/ 31 января 2020

Это даст вам идентификаторы продуктов с выбранными тегами:

SELECT p.id
FROM products AS p
   JOIN products2tags AS p2t
      ON p.id = p2t.id_product
   WHERE p2t.id_tag in (1, 3)
   group by p.id
   having count(*) = (select count(distinct id_tag) 
                      from products2tags where id_tag in (1, 3)
                     );

Просто получите продукт с одним из идентификаторов тегов в списке без дублирования:

SELECT distinct p.*
FROM products AS p
   JOIN products2tags AS p2t
      ON p.id = p2t.id_product
   WHERE p2t.id_tag in (1, 3);
...