MYSQL выбрать и объединить несколько предложений AND в одной таблице - PullRequest
1 голос
/ 13 марта 2019

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

tag

id              PID       tag
------------------------------
0c212c04_Gold   0c212c04  Gold
0c212c04_500g   0c212c04  500g
0c212c04_Coin   0c212c04  Coin

Сначала я попробовал OR и IN, но это вернуло все результаты.Даже если у них был только один из обязательных тегов

SELECT DISTINCT p.* 
FROM products p
INNER JOIN product_tags pt ON (p.PID = pt.PID)
WHERE pt.tag = 'Gold' OR pt.tag = '10oz' AND p.RRP BETWEEN 0 AND 1000000

SELECT DISTINCT p.* 
FROM products p
INNER JOIN product_tags pt ON (p.PID = pt.PID)
WHERE pt.tag IN ('Gold','10oz') AND p.RRP BETWEEN 0 AND 1000000

, поэтому я попытался AND, который возвращает 0 результаты.

SELECT DISTINCT p.* 
FROM products p
INNER JOIN product_tags pt ON (p.PID = pt.PID)
WHERE pt.tag = 'Gold' AND pt.tag = '10oz' AND p.RRP BETWEEN 0 AND 1000000

Как вернуть все продукты, которые имеют несколько тегов Gold и 10oz и Coin?

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

Вы можете использовать предложение HAVING:

SELECT p.* 
FROM products p JOIN
     product_tags pt 
     ON p.PID = pt.PID
WHERE pt.tag IN ('Gold', '10oz') AND 
      p.RRP BETWEEN 0 AND 1000000
GROUP BY p.PID  -- okay assuming PID is unique/primary key
HAVING COUNT(*) = 2;
1 голос
/ 13 марта 2019

Вот опция, которая опирается на агрегацию условий и может обрабатывать любое количество условий (просто добавьте больше условий к предложению HAVING):

SELECT p.id
FROM products p
INNER JOIN product_tags pt ON p.PID = pt.PID
WHERE p.rrp BETWEEN 0 AND 1000000
GROUP BY p.id
HAVING MAX(pt.tag = 'GOLD') = 1 AND MAX(pt.tag = '10oz') = 1

Примечание: если вам нужно больше столбцов из products, вам необходимо добавить их в SELECT и в предложении GROUP BY (это не повлияет на результаты запроса, поскольку первичный ключ product.id уже является частью неагрегированных столбцов).

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