Возвращает значение только тогда, когда существует значение внутри предложения `in` - PullRequest
0 голосов
/ 19 сентября 2018

Хорошо, я честно думаю, что мой заголовок неверен, однако именно так я и интерпретировал свою проблему.

Вот мои примеры данных:

id diagnosis symptom
 1 a          c
 2 a          a
 3 a          b
 6 b          a
 7 b          c

Моя проблема заключается в том, как я могу получить диагноз только с условием внутри inпредложение?

Вот мой запрос:

SELECT diagnosis 
FROM vdoc_b_symptom
WHERE symptom IN ('a','c')
GROUP BY diagnosis 
HAVING COUNT(*) = 2;

Вывод, который я хочу получить, составляет всего b, однако он дал мне два выхода.Как я могу получить значение a только из столбца «диагностика» с условиями для симптомов a и c?Извините за мой английский, это было так плохо.

enter image description here

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

Попробуйте запрос ниже.

SELECT DISTINCT diagnosis
FROM vdoc_b_symptom v
WHERE NOT EXISTS (
    SELECT 1
    FROM vdoc_b_symptom
    WHERE diagnosis = v.diagnosis AND symptom NOT IN ('a', 'c')
)
0 голосов
/ 19 сентября 2018

Возможно, есть какой-то более умный способ сделать это, но, как я понимаю, вам нужны результаты, чтобы 1) иметь оба симптома «а» и «с», а также 2) не иметь никаких других симптомов.Так что:

SELECT * 
FROM   vdoc_b_symptom 
WHERE  diagnosis IN (SELECT diagnosis 
                     FROM   vdoc_b_symptom 
                     WHERE  symptom IN ( 'a', 'c' ) 
                     GROUP  BY diagnosis 
                     HAVING Count(*) = 2) 
       AND diagnosis NOT IN (SELECT diagnosis 
                             FROM   vdoc_b_symptom 
                             WHERE  symptom NOT IN ( 'a', 'c' )) 

должно достичь этого.Может потребоваться назвать некоторые таблицы и указать столбцы.

0 голосов
/ 19 сентября 2018

Вы можете попробовать использовать условие в HAVING

Схема (MySQL v5.6)

CREATE TABLE vdoc_b_symptom(
  diagnosis varchar(5),
  symptom varchar(5)
);

insert into vdoc_b_symptom values ('a','a');
insert into vdoc_b_symptom values ('a','b');
insert into vdoc_b_symptom values ('a','c');
insert into vdoc_b_symptom values ('b','a');
insert into vdoc_b_symptom values ('b','c');

Запрос № 1

SELECT 
        diagnosis
    FROM 
        vdoc_b_symptom
    GROUP BY 
          diagnosis
    HAVING 
        COUNT(distinct symptom) = 2 
    AND 
        SUM(symptom = 'a') > 0 
    AND 
        SUM(symptom = 'c') > 0;

| diagnosis |
| --------- |
| b         |

Показать на БД Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...