Возвращает значение только тогда, когда существует значение внутри предложения `in`

0

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

Вот мои данные:

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? Извините за мой английский, это было так плохо.

Изображение 174551

  • 1
    Узнайте, что такое GROUP BY . Какова цель использования GROUP BY если у вас нет агрегации ???
Теги:

3 ответа

2
Лучший ответ

Вы можете попробовать использовать условие в 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         |

Посмотреть на DB Fiddle

1

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

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

Вероятно, это более умный способ сделать это, но, как я понимаю, вам нужны результаты: 1) иметь как симптомы "a", так и "c", а также 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' )) 

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню