Mam 2 tabele customer_address_entity

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

I 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

I chcę wybrać wszystkie elementy customer_address_entity, które nie mają żadnej atrybut_id = 31 w customer_address_entity_varchar.

Na przykład customer_address_entity Entity_ID = 2 mają customer_address_entity_varchar Wartości atrybutów 21 i 22, ale nie 31. Chcę wybrać ten jeden.

Właśnie teraz dołączam do obu stołów i grupuję je entity_id, ale

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`;

Przykład połączonych tabel z grupy_by:

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

Utknąłem tutaj, ponieważ nie wiem, jak wybrać grupę, która nie ma 31 w atrybut_d.

Pożądany rezultat:

entity_id | attribute_id | value
---------------------------------------
2         | 21           | something_2
0
Alex 5 czerwiec 2018, 12:09

3 odpowiedzi

Najlepsza odpowiedź

Możesz osiągnąć pożądany wynik za pomocą klauzuli nie istnieje. Wypróbuj poniższe zapytanie, sprawdzanie identyfikatora podmiotu dla atrybutu 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  ) 
2
Fahad Anjum 5 czerwiec 2018, 09:23

Jedną opcją jest użycie agregacji, aby znaleźć dopasowane grupy:

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;

Jeśli nie chcesz, aby pełne dopasowywanie rekordów z tabeli {x0}}, a zamiast tego po prostu chcesz wartości entity_id, a następnie użyj powyższych podzewności aliased jako t2.

2
Tim Biegeleisen 5 czerwiec 2018, 09:17
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)

Musisz usunąć wszystkie entity_id z pierwszego zapytania, które mają atrybut_id = 31

2
Sudipta Mondal 5 czerwiec 2018, 09:17