Хорошо, я честно считаю, что мой заголовок неверен, однако, как я интерпретировал свою проблему.
Вот мои данные:
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
? Извините за мой английский, это было так плохо.
Вы можете попробовать использовать условие в 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 |
Попробуйте выполнить запрос ниже.
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')
)
Вероятно, это более умный способ сделать это, но, как я понимаю, вам нужны результаты: 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' ))
должен достичь этого. Может потребоваться назвать некоторые таблицы и квалифицировать столбцы.
GROUP BY
. Какова цель использованияGROUP BY
если у вас нет агрегации ???