SELECT запрос, где 1 столбец равен 2 переменным

Проблема: Я хочу выбрать продукты, у которых есть option_value_id как из 1, так и 3. Но, как вы можете видеть, он также покажет продукты, которые имеют только 1 из option_value_ids.

Я попробовал добавить AND вместо IN, но это, очевидно, не покажет никаких результатов.

Ответ может быть прост, но сейчас я просто не могу понять это. Может ли кто-нибудь помочь мне? Даже небольшой намек можно оценить.

enter image description here

2
nl ja de
woah так красочно, на чем эта платформа sql покоится?
добавлено автор bonCodigo, источник
о, конечно, я не был саркастичен. Это действительно броское. И мне даже было интересно, если вы используете его на Mac ...;) (если есть возможность запускать MYSql на mac ..)
добавлено автор bonCodigo, источник
@bonCodigo: выглядит как современный gui нового phpMyAdmin
добавлено автор cypherabe, источник
Не уверен, что @bonCodigo саркастично, но это PHPMyAdmin 3.5.2.2.
добавлено автор user1961685, источник
Нет, я никогда не работал с Mac. Вы должны иметь возможность запускать PHPMyAdmin на любом веб-сервере, если у него работает MySQL. Для Mac есть LAMP/MAMP. Но я думаю, что это немного не по теме.
добавлено автор user1961685, источник

4 ответы

Это называется Relation Division , и вот один из способов сделать это:

SELECT *
FROM TABLEName 
WHERE Product_ID IN(SELECT Product_ID
            FROM Tablename
            WHERE option_value_id IN(1, 3)
            GROUP BY Product_ID
            HAVING COUNT(option_value_id) = 2);

Демо-версия SQL Fiddle

Это даст вам:

| ID | PRODUCT_ID | OPTION_VALUE_ID |
-------------------------------------
|  1 |          1 |               1 |
|  3 |          1 |               3 |
| 13 |          2 |               3 |
| 14 |          2 |               1 |
4
добавлено
@ user1961685 product_id 12 не имеет как 1, так и 2, он имеет только 3 в данных выборки. См. Мое редактирование.
добавлено автор Mahmoud Gamal, источник
@ user1961685 Добро пожаловать в любое время :)
добавлено автор Mahmoud Gamal, источник
Спасибо за ответ, но он должен вернуть product_id 1, 2 и 12. Как вы можете видеть, у product_id 1, 2 и 12 есть опции_value_id 1 и 3.
добавлено автор user1961685, источник
Ах, плохо. Спасибо за ответ и за скрипту.
добавлено автор user1961685, источник

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

select pa.product_id
from Product_Attributes pa
group by pa.product_id
having max(pa.option_value_id = 1) = 1 and
       max(pa.option_value_id = 3) = 1
0
добавлено

Попробуй это:

SELECT * 
FROM products_attributes 
WHERE option_value_id IN (1, 3) 
GROUP BY product_id 
HAVING COUNT(*) = 2
0
добавлено

This is a common problem, called Relational Division, there is even a tag in SO for it: sql-match-all

Как правило, существует уникальное ограничение на (product_id, option_value_id) , поэтому одно решение - использовать 2 соединения (N присоединяется, если вы хотите проверить атрибуты N):

SELECT p.*                 -- whatever columns you need 
FROM product AS p          -- from the `product` table
  JOIN products_attributes AS pa1
    ON  pa1.option_value_id = 1
    AND pa1.product_id = p.product_id
  JOIN products_attributes AS pa2
    ON  pa2.option_value_id = 3
    AND pa2.product_id = p.product_id ;

There is a similar question, with more than 10 different ways to achieve the same result (and benchmarks for Postgres): How to filter SQL results in a has-many-through relation

0
добавлено
DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.

MySQL
MySQL
995 участник(ов)

The group is about MySQL. For code use hastebin.com. Admin: @smlkw

SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)