2010-06-22 4 views
0

je suit la structure de base de données,beaucoup à plusieurs requêtes

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: Désolé, je veux dire: comment identifier la maladie des symptômes entrées. Exemple: Si j'ai un symptôme: de la fièvre et de la toux, alors j'aurais la grippe. Si j'ai un symptôme: mal de gorge et fièvre, j'aurais une infection de la gorge. Les entrées sont $symptom1, $symptom2, $symptom3, et ainsi de suite.

Merci.

Répondre

8
SELECT disease_id 
FROM analyze 
GROUP BY disease_id 
HAVING COUNT(symptom_id) > 1 

Edit: pour répondre à la question éditée

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 

Bien sûr, vous devrez remplacer $symptomX par leurs ID respectifs de.

Cette requête répertorie les maladies qui correspondent au moins un symptôme - les maladies qui correspondent le plus à la plupart des symptômes sont sur le dessus.

Si vous avez ajouté une contrainte unique sur symptom _id et disease_id dans analyze, vous pourriez perdre le 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
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 
+0

vous pouvez également ajouter d.name dans la requête (et grouper par) – potatopeelings

0
select disease_id, count(*) 
from analyze 
where symptom_id in ($symptom1, $symptom2, $symptom3) 
group by disease_id 
order by 2 descending; 

retournera les ids de la maladie correspondante dans l'ordre décroissant des symptômes correspondants.