MYSQL отображать группы, которые не содержат определенного значения в одном столбце - PullRequest
0 голосов
/ 05 июня 2018

У меня есть 2 таблицы customer_address_entity

entity_id | foo | bar
----------------------
1         | bla | bla
2         | bla | bla
3         | bla | bla

и customer_address_entity_varchar

value_id | attribute_id |entity_id | value
-------------------------------------------------
1        | 21           | 1        | something_1
2        | 22           | 1        | anything_1
3        | 31           | 1        | whatever_1
4        | 21           | 2        | something_2
5        | 22           | 2        | anything_2
6        | 21           | 3        | something_3
7        | 31           | 3        | whatever_3

, и я хочу выбрать все элементы в customer_address_entity, которые не имеют никакого attribute_id= 31 значение в customer_address_entity_varchar.

Например, customer_address_entity entity_id = 2 имеет customer_address_entity_varchar attribute_id значения 21 и 22, но не 31. Поэтому я хочу выбрать это.

сейчас я присоединяюсь к обеим таблицам и группирую их по entity_id, но

SELECT cae.`entity_id`, caev.`attribute_id`, caev.`value`
FROM `customer_address_entity` AS `cae`
INNER JOIN `customer_address_entity_varchar` AS `caev`
ON cae.`entity_id`=caev.`entity_id`
GROUP BY cae.`entity_id`;

пример объединенных таблиц с GROUP_BY:

entity_id | attribute_id | value
---------------------------------------
1         | 21           | something_1
2         | 21           | something_2
3         | 21           | something_3

Я застрялздесь, поскольку я не знаю, как выбрать группу, у которой нет 31 в attribute_id.

желаемый результат:

entity_id | attribute_id | value
---------------------------------------
2         | 21           | something_2

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Вы можете достичь желаемого результата, используя пункт «не существует».Попробуйте следующий запрос: он проверяет каждый идентификатор объекта на атрибут id = 31.

SELECT * 
FROM customer_address_entity_varchar t1
WHERE 
NOT EXISTS (SELECT 1 FROM customer_address_entity_varchar t2 WHERE t1.entity_id = t2.entity_id
and attribute_id = 31  ) 
0 голосов
/ 05 июня 2018
SELECT cae.`entity_id`, caev.`attribute_id`, caev.`value`
FROM `customer_address_entity` AS `cae`
INNER JOIN `customer_address_entity_varchar` AS `caev`
ON cae.`entity_id`=caev.`entity_id`
where cae.entity_id not in (select caev2.entity_id  from `customer_address_entity_varchar` AS `caev2` where caev2.attribute_id = 31)

Вам необходимо удалить все entity_ids из первого запроса, которые имеют attribute_id = 31

0 голосов
/ 05 июня 2018

Один из вариантов - использовать агрегацию для поиска подходящих групп:

SELECT t1.entity_id, t1.attribute_id, t1.value
FROM customer_address_entity_varchar t1
INNER JOIN
(
    SELECT entity_id
    FROM customer_address_entity_varchar
    GROUP BY entity_id
    HAVING SUM(CASE WHEN attribute_id = 31 THEN 1 ELSE 0 END) = 0
) t2
    ON t1.entity_id = t2.entity_id;

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

...