Как MySQL DISTINCT (COUNT) возвращая одинаковое количество строк по разным критериям? - PullRequest
1 голос
/ 23 марта 2012

У меня есть два запроса, которые я унаследовал, чтобы получить общее количество пациентов для разных кодов ролей, проблема в том, что они возвращают одно и то же число - теперь я знаю, что DISTINCT производит это из-за отношений один-ко-многим вТаблицы описаны ниже, но я не уверен, как добавить дополнительные критерии в запрос для изоляции:

Запрос 1 (Результаты теоретически должны быть меньше

SELECT count(DISTINCT p.patient)
FROM react r
INNER JOIN CasesR cr
ON cr.globalid = r.globalid
LEFT JOIN profile p
ON cr.globalid = p.globalid
WHERE r.desc = 'A'
AND cr.rcode = 'PS'

Запрос 1 (Результаты теоретически должны быть намного больше)

SELECT count(DISTINCT p.patient)
FROM react r
INNER JOIN CasesR cr
ON cr.globalid = r.globalid
LEFT JOIN profile p
ON cr.globalid = p.globalid
WHERE r.desc = 'A'

реагировать Ключевые поля

 rrecordid (PK)
 globalid (Multiples in table IE: rrecordid=1,globalid=122; rrecordid=2,globalid=333)
 desc (Multiples in table IE: rrecordid=1,globalid=122; rrecordid=2,globalid=333)

CasesR Ключевые поля

 crecordid (PK)
 globalid 
 (Multiples in table IE: crecordid=1,globalid=122;crecordid=2,globalid=333)
 rcode (enum: 'A','B','C','D') 
 (multiples, globalid=122;rcode=A; globalid=122;rcode=B)

ПрофильКлючевые поля

 globalid (PK)
 patient (Multiples in table IE: globalid=1,patient=122;globalid=2,patient=122)

Так как же изменить этот запрос, чтобы получить истинные значения?

Спасибо

1 Ответ

0 голосов
/ 23 марта 2012

Чтобы свести воедино то, на что идут комментарии выше. , , Ваш запрос равен , что дает вам истинное значение. Ваш первый запрос (с AND cr.rcode = 'PS') означает следующее:

Найти все profile записей, которые (1) имеют соответствующую запись в react с desc = 'A' , а (2) имеют соответствующую запись в casesr с rcode = 'PS'. Сколько различных значений существует для этих profile записей 'patient полей?

Ваш второй запрос (без AND cr.rcode = 'PS') означает то же самое, за исключением того, что ограничение # 2 изменено с «иметь соответствующую запись в casesr с rcode = 'PS'» на «просто» иметь соответствующую запись в casesr». Естественно, поскольку это более слабое ограничение, оно никогда не даст меньшее значение; но это, безусловно, может дать такое же значение.

Вы говорите, что унаследовали эти запросы; Вы уверены, что человек, который их написал, на самом деле не намеревался , чтобы они обычно давали такой же результат? Возможно, довольно необычно, что patient будет отвечать всем требованиям второго запроса, не удовлетворяя небольшому дополнительному требованию первого запроса.

...