ВЫБЕРИТЕ, когда для одного идентификатора sql выполнены 2 условия - PullRequest
0 голосов
/ 30 марта 2020

Данные моего примера

     ID        State 
     11        3
     11        3
     12        3
     12        6
     12        7
     13        3
     13        6
     13        7
     14        4
     14        4
     14        6
     15        3
     15        3
     16        3
     16        6
     16        7
     17        3
     17        7

Я хочу ВЫБРАТЬ только идентификаторы, которые имеют 3 и 6 ИЛИ 7. Поэтому в этом примере выбраны идентификаторы 12, 13, 16 и 17 (так как они имеют 3 и 6 или 7). Я пытался работать с

, где состояние IN (3, 6, 7). Следовательно, это выбирает только те случаи, в которых есть один для 3-х состояний, но я хочу решение, в котором я могу сказать, выберите, когда ID имеет по крайней мере 3 и 6 ИЛИ 7. Таким образом, комбинации 3 и 6, 3 и 7 и 3 & 6 & 7 выбраны.

Ответы [ 4 ]

0 голосов
/ 30 марта 2020

Вы можете сгруппировать по id и установить условия в пункте having:

select id
from tablename
where state in (3, 6, 7)
group by id
having sum(state = 3) and sum(state in (6, 7))

См. Демонстрационную версию .

Если вы хотите, чтобы эти id s не имели других состояний, тогда:

select id
from tablename
group by id
having sum(state = 3) and sum(state in (6, 7))
and not sum(state not in (3, 6, 7))

См. Демонстрационную версию .

Результаты:

| id  |
| --- |
| 12  |
| 13  |
| 16  |
| 17  | 
0 голосов
/ 30 марта 2020

Вы можете сделать это с помощью подвыбора. Пример:

select ID, STATE
FROM [TABLENAME]
WHERE ID in
 (select ID FROM [TABLENAME] WHERE state IN (3, 6, 7))

Подробную информацию можно найти здесь: https://www.w3resource.com/sql/subqueries/understanding-sql-subqueries.php

0 голосов
/ 30 марта 2020

Просто для забавы вы можете group_concat и немного поработать со строками, чтобы получить желаемый результат

DROP TABLE IF EXISTS T;

CREATE TABLE T (
ID int,       State int);
insert into t values
(     11     ,   3),
(     11     ,   3),
(     12     ,   3),
(     12     ,   6),
(     12     ,   7),
(     13     ,   3),
(     13     ,   6),
(     13     ,   7),
(     14     ,   4),
(     14     ,   4),
(     14     ,   6),
(     15     ,   3),
(     15     ,   3),
(     16     ,   3),
(     16     ,   5),
(     16     ,   7),
(     17     ,   3),
(     17     ,   7),
(     18     ,   2),
(     18     ,   3),
(     18     ,   5),
(     18     ,   6),
(     19     ,   7),
(     19     ,   3),
(     19     ,   5)
;

select id,
             group_concat(distinct case when state in (3,6,7) then state end order by state asc)
from t
group by id
having substring_index(group_concat(distinct case when state in (3,6,7) then state end order by state asc),',',2) = '3,6' or
         concat(
         substring_index(group_concat(distinct case when state in (3,6,7) then state end order by state asc),',',1) 
         ,',',
         substring_index(group_concat(distinct case when state in (3,6,7) then state end order by state asc),',',-1) 
         ) = '3,7'       
;

+------+-------------------------------------------------------------------------------------+
| id   | group_concat(distinct case when state in (3,6,7) then state end order by state asc) |
+------+-------------------------------------------------------------------------------------+
|   12 | 3,6,7                                                                               |
|   13 | 3,6,7                                                                               |
|   16 | 3,7                                                                                 |
|   17 | 3,7                                                                                 |
|   18 | 3,6                                                                                 |
|   19 | 3,7                                                                                 |
+------+-------------------------------------------------------------------------------------+
6 rows in set (0.002 sec)

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

0 голосов
/ 30 марта 2020

Вы можете попробовать это ниже logi c, используя GROUP BY и HAVING для достижения требуемого результата. Хотя вы не упомянули имя своей базы данных, следующие логики c должны работать для большинства СУБД.

DEMO HERE

SELECT ID 
FROM your table
GROUP BY ID
HAVING COUNT(DISTINCT CASE WHEN State IN (3,6) THEN State ELSE NULL END) = 2
OR COUNT(DISTINCT CASE WHEN State IN (7) THEN State ELSE NULL END) = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...