Sql выбрать, где массив в столбце - PullRequest
0 голосов
/ 03 марта 2019

В своем запросе я использую таблицу соединений category_attributes.Предположим, у нас есть такие строки:

category_id|attribute_id
1|1
1|2
1|3

Я хочу запрос, который удовлетворяет двум следующим потребностям.У меня есть переменная (php) разрешено attribute_id's.Если массив имеет подмножество attribute_id, то следует выбрать category_id, если нет - никаких результатов.

Первый случай:

select * from category_attributes where (1,2,3,4) in category_attributes.attribute_id

не должен давать результатов.

Второй случай

select * from category_attributes where (1,2,3) in category_attributes.attribute_id

должен дать все три строки (см. Фиктивные строки в начале).

Поэтому я хотел бы иметь обратную сторону того, что делает стандартный SQL in.

Ответы [ 3 ]

0 голосов
/ 03 марта 2019

Решение

Шаг 1: Сгруппируйте данные по полю, которое вы хотите проверить.

Шаг 2: Присоединитесь к списку слеваобязательные значения с записями, полученными на предыдущем шаге.

Шаг 3: Теперь у нас есть список с обязательными значениями и соответствующими значениями из таблицы.Второй столбец будет равен требуемому значению, если оно существует в таблице, и NULL в противном случае.

Step 3 output

Подсчитать нулевые значения в правом столбце.Если он равен 0, то это означает, что таблица содержит все необходимые значения.В этом случае верните все записи из таблицы.В противном случае в таблице должно быть хотя бы одно обязательное значение.Итак, не возвращайте никаких записей.

Образец

Таблица «Данные»:

Table data

Необходимые значения: 10, 20, 50

Запрос:

SELECT * 
FROM   Data 
WHERE  (SELECT Count(*) 
        FROM   (SELECT D.value 
                FROM   (SELECT 10 AS value 
                        UNION 
                        SELECT 20 AS value 
                        UNION 
                        SELECT 50 AS value) T 
                       LEFT JOIN (SELECT value 
                                  FROM   Data 
                                  GROUP  BY value) D 
                              ON ( T.value = D.value )) J 
        WHERE  value IS NULL) = 0;
0 голосов
/ 03 марта 2019

Вы можете использовать group by и having:

select ca.category_id
from category_attributes ca
where ca.attribute_id in (1, 2, 3, 4) 
group by ca.category_id
having count(*) = 4;  -- "4" is the size of the list

Предполагается, что в таблице нет дубликатов (что типично для таблиц отображения атрибутов).Если это возможно, используйте:

having count(distinct ca.attribute_id) = 4
0 голосов
/ 03 марта 2019

Вы можете объединить attribute_id в массив и сравнить два массива из php.

SELECT category_id FROM 
(select category_id, group_concat(attribute_id) as attributes from category_attributes
order by attribute_id) t WHERE t.attributes = (1, 2, 3);

Но вам нужно найти другой способ сравнения массивов или убедиться, что массив всегда сортируется.

...