Mysql: несколько самостоятельных присоединиться?

Я строю проверку симптомов. Когда пользователь выбирает симптомы, мы предлагаем другие симптомы от болезней, которые имеют общие симптомы, выбранные пользователем, пока мы не сможем сузить до конкретного заболевания. У меня есть этот стол.

ailment_symptoms
+----+----------+-----------+
|id  |ailment_id|symptom_id |
+----+----------+-----------+
|1   | 1        |  1        |
|2   | 1        |  2        |
|3   | 2        |  1        |
|4   | 2        |  3        |
|5   | 3        |  3        |
|6   | 3        |  2        |
|7   | 4        |  1        |
|8   | 4        |  2        |
+----+----------+-----------+

Если я хочу выбрать ailment_ids записей, которые имеют sympom_id 1 и 2, я использую этот запрос самостоятельного соединения.

SELECT t1.ailment_id
FROM ailment_symptoms t1
JOIN ailment_symptoms t2 ON t1.ailment_id = t2.ailment_id
WHERE t1.symptom_id =  '1'
AND t2.symptom_id =  '2'

который вернется

+----------+
|ailment_id|
+----------+
| 1        |
| 4        |
+----------+

Как мне это сделать, когда есть более двух симптомов. Я хочу написать php-код, который будет отображать столько симптомов, сколько вводят пользователи. код должен выглядеть так:

$user_symptoms = array($symptom_id_1, $symptom_id_2, $symptom_id_3);  //as many symptom as the user picks
$query = "SELECT t1.ailment_id FROM ailment_symptoms t1";

foreach($user_symptoms AS $symptoms){
//here is where we construct the multiple self join and append it to $query
//please replace this comment with appropriate code
}

$query .= "WHERE ";
//loop through $user_symptoms and append t1.symptom_id =  '$user_symptom[0]' AND '....'

Пожалуйста, помогите мне заменить комментарии с соответствующим кодом.

0

Решение

Вы также можете сделать это с агрегацией. Для вас может быть проще построить такие запросы, потому что легче обрабатывать дополнительные атрибуты.

SELECT s.ailment_id
FROM ailment_symptoms s
WHERE s.symptom_id in (1, 2)
GROUP BY s.ailment_id
HAVING COUNT(DISTINCT s.symptom_id) = 2;

Вы просто должны быть уверены, что «2» соответствует количеству элементов в списке в where пункт. Тогда это будет обобщать на любое количество симптомов.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]