запрос многие ко многим - PullRequest
0 голосов
/ 22 июня 2010

У меня следующая структура базы данных,

CREATE TABLE IF NOT EXISTS `analyze` (
  `disease_id` int(11) NOT NULL,
  `symptom_id` int(11) NOT NULL
) ;


CREATE TABLE IF NOT EXISTS `disease` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(10) NOT NULL,
  PRIMARY KEY  (`id`)
) ;


CREATE TABLE IF NOT EXISTS `symptom` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(4) NOT NULL,
  PRIMARY KEY  (`id`)
) ;

EDIT: Извините, я имею в виду, как определить заболевание по введенным симптомам. Пример: Если у меня есть симптомы: лихорадка и кашель, у меня будет грипп. Если у меня есть симптом: боль в горле и лихорадка, у меня будет инфекция горла. Входные данные $symptom1, $symptom2, $symptom3 и т. Д.

Спасибо.

Ответы [ 3 ]

8 голосов
/ 22 июня 2010
SELECT disease_id
FROM analyze
GROUP BY disease_id
HAVING COUNT(symptom_id) > 1

Редактировать: чтобы ответить на отредактированный вопрос

SELECT disease_id, COUNT(DISTINCT symptom_id)
FROM analyze
WHERE symptom_id IN ($symptom1, $symptom2, $symptom3)
GROUP BY disease_id
ORDER BY COUNT(DISTINCT symptom_id) DESC

Конечно, вам придется заменить $symptomX их соответствующими идентификаторами.

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

Если вы добавили уникальное ограничение для symptom _id и disease_id в analyze, вы можете потерять DISTINCT:

SELECT disease_id, COUNT(symptom_id)
FROM analyze
WHERE symptom_id IN ($symptom1, $symptom2, $symptom3)
GROUP BY disease_id
ORDER BY COUNT(symptom_id) DESC
0 голосов
/ 22 июня 2010
select disease_id, count(*)
from analyze
where symptom_id in ($symptom1, $symptom2, $symptom3)
group by disease_id 
order by 2 descending;

вернет совпадающие идентификаторы заболевания в порядке убывания совпадающих симптомов.

0 голосов
/ 22 июня 2010
select d.id from disease d inner join analyze a
    on d.id = a.disease_id
    group by d.id having count(a.disease_id) > 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...