Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Mysql:多个自连接?_Php_Mysql_Self Join - Fatal编程技术网

Php Mysql:多个自连接?

Php Mysql:多个自连接?,php,mysql,self-join,Php,Mysql,Self Join,我正在建立一个症状检查器。当用户选择症状时,我们建议用户选择症状相同的疾病的其他症状,直到我们可以缩小到特定的疾病。我有这张桌子 ailment_symptoms +----+----------+-----------+ |id |ailment_id|symptom_id | +----+----------+-----------+ |1 | 1 | 1 | |2 | 1 | 2 | |3 | 2 |

我正在建立一个症状检查器。当用户选择症状时,我们建议用户选择症状相同的疾病的其他症状,直到我们可以缩小到特定的疾病。我有这张桌子

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        |
+----+----------+-----------+
如果我想选择症状id为1和2的条目的疾病id,我使用这个自连接查询

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        |
+----------+
当有两个以上的症状ID时,如何执行此操作。我想编写一个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 '....'

请帮助我用适当的代码替换注释。

您也可以使用聚合来完成此操作。这样构造查询可能更容易,因为处理附加属性更容易

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
子句中列表中的元素数匹配即可。然后它将推广到任何数量的症状。

您也可以通过聚合来实现这一点。这样构造查询可能更容易,因为处理附加属性更容易

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
子句中列表中的元素数匹配即可。然后它将推广到任何数量的症状。

因此,如果我有症状ID 2、4、6、9。。该查询将从(2,4,6,9)组中的s.symptom_id中选择s.ailment_id,其中s.symptom_id具有计数(不同的s.symptom_id)=4;是吗?假设有第三列
强度
,值为
急性-正常-轻度
。我如何添加一个过滤器,其中包括在用户选择的组中有症状的疾病id和强度
acute
…类似于
…WHERE(s1.symptom\u id='1'和s1.intensity='acute')
您可以根据需要更改
WHERE
子句。拥有的
仍然会计算不同症状的数量,这样就可以了。你能给我举个例子吗。并非所有症状的症状都相同。有些人会有轻微的头痛和急性胃痛……等等……所以如果我有症状2、4、6、9。。该查询将从(2,4,6,9)组中的s.symptom_id中选择s.ailment_id,其中s.symptom_id具有计数(不同的s.symptom_id)=4;是吗?假设有第三列
强度
,值为
急性-正常-轻度
。我如何添加一个过滤器,其中包括在用户选择的组中有症状的疾病id和强度
acute
…类似于
…WHERE(s1.symptom\u id='1'和s1.intensity='acute')
您可以根据需要更改
WHERE
子句。拥有
仍然会计算不同症状的数量,这样就可以了。你能给我举个例子吗。并非所有症状的症状都相同。有些人会有轻微的头痛和急性胃痛……等等。。。