Php 如何在MySQL中应用真实度?
它显示出几种疾病。我只希望根据我输入的内容在数据库中检索最近的疾病。然后,结果是狼疮和麻疹Php 如何在MySQL中应用真实度?,php,mysql,Php,Mysql,它显示出几种疾病。我只希望根据我输入的内容在数据库中检索最近的疾病。然后,结果是狼疮和麻疹 <?php include('connect.php'); //Function to sanitize values received from the form. Prevents SQL injection //Sanitize the POST values $symptom1 = $_POST['symptom1']
<?php
include('connect.php');
//Function to sanitize values received from the form. Prevents SQL injection
//Sanitize the POST values
$symptom1 = $_POST['symptom1'];
$symptom2 = $_POST['symptom2'];
$symptom3 = $_POST['symptom3'];
$symptom4 = $_POST['symptom4'];
$sql = mysql_query("SELECT disease FROM diseases WHERE
symptom1 LIKE '%". $symptom1."%' OR symptom1 LIKE '%". $symptom2."%' OR symptom1 LIKE '%". $symptom3."%' OR symptom1 LIKE '%". $symptom4."%' AND
symptom2 LIKE '%". $symptom1."%' OR symptom2 LIKE '%". $symptom2."%' OR symptom2 LIKE '%". $symptom3."%' OR symptom2 LIKE '%". $symptom4."%' AND
symptom3 LIKE '%". $symptom1."%' OR symptom3 LIKE '%". $symptom2."%' OR symptom3 LIKE '%". $symptom3."%' OR symptom3 LIKE '%". $symptom4."%' AND
symptom4 LIKE '%". $symptom1."%' OR symptom4 LIKE '%". $symptom2."%' OR symptom4 LIKE '%". $symptom3."%' OR symptom4 LIKE '%". $symptom4."%'");
while($row = mysql_fetch_array($sql))
{
echo $row['disease'];
}
//end of while loop
?>
编辑:似乎你真正想要的是全文索引:
CREATE FULLTEXT INDEX ix_disease_symptoms
ON diseases(symptom1, symptom2, symptom3, symptom4);
然后使用MATCH查询:
$symptom1 = $_POST['symptom1'];
$symptom2 = $_POST['symptom2'];
$symptom3 = $_POST['symptom3'];
$symptom4 = $_POST['symptom4'];
$sql = "SELECT disease,
MATCH(symptom1, symptom2, symptom3, symptom4)
AGAINST('{$symptom1} {$symptom2} {$symptom3} {$symptom4}') AS score
FROM diseases
WHERE MATCH(symptom1, symptom2, symptom3, symptom4)
AGAINST('{$symptom1} {$symptom2} {$symptom3} {$symptom4}')
ORDER BY score DESC";
$result = mysql_query($sql);
if ($result) {
while($row = mysql_fetch_assoc($result)) {
echo $row['disease'];
}
} else {
die(mysql_error());
}
编辑:似乎您真正想要的是全文索引:
CREATE FULLTEXT INDEX ix_disease_symptoms
ON diseases(symptom1, symptom2, symptom3, symptom4);
然后使用MATCH查询:
$symptom1 = $_POST['symptom1'];
$symptom2 = $_POST['symptom2'];
$symptom3 = $_POST['symptom3'];
$symptom4 = $_POST['symptom4'];
$sql = "SELECT disease,
MATCH(symptom1, symptom2, symptom3, symptom4)
AGAINST('{$symptom1} {$symptom2} {$symptom3} {$symptom4}') AS score
FROM diseases
WHERE MATCH(symptom1, symptom2, symptom3, symptom4)
AGAINST('{$symptom1} {$symptom2} {$symptom3} {$symptom4}')
ORDER BY score DESC";
$result = mysql_query($sql);
if ($result) {
while($row = mysql_fetch_assoc($result)) {
echo $row['disease'];
}
} else {
die(mysql_error());
}
这是一个经典的论点的重要性。考虑对关系表模式进行重新设计:
症状
组合的所有顺序可能性,而是在或或
子句中检查一个简单、清晰的:
$sql = "SELECT d.Disease,
ds.SymptomID,
s.Symptom
FROM Diseases d
INNER JOIN DiseaseSymptomJoin ds
ON d.DiseaseID = ds.DiseaseID
INNER JOIN Symptoms s
ON ds.SymptomID = s.SymptomID
WHERE s.Symptom
IN (".$symptom1.", ".$symptom2.", ".$symptom3.", ".$symptom4.")";
或者,使用分数聚合:
$sql = "SELECT Disease,
Score
FROM
(SELECT d.DiseaseID,
d.Disease,
Count(*) As score
FROM Diseases d
INNER JOIN DiseaseSymptomJoin ds
ON d.DiseaseID = ds.DiseaseID
INNER JOIN Symptoms s
ON ds.SymptomID = s.SymptomID
WHERE s.Symptom
IN (".$symptom1.", ".$symptom2.", ".$symptom3.", ".$symptom4.")
GROUP BY d.DiseaseID,
d.Disease
) As dT
ORDER BY score DESC";
这是一个经典的论点的重要性。考虑对关系表模式进行重新设计:
独特的疾病表
明显的症状表
疾病症状联接表是一个多对多的疾病和症状联接表,其中多个疾病可以维持彼此共享的多个症状李>
此外,不需要复杂、复合或全文键。此外,这种结构可以很好地扩展到无限多的疾病和症状,而不是限制在4个
最重要的是,查询更易于阅读和维护,您不再需要根据用户的选择检查四个症状
组合的所有顺序可能性,而是在
或或
子句中检查一个简单、清晰的:
$sql = "SELECT d.Disease,
ds.SymptomID,
s.Symptom
FROM Diseases d
INNER JOIN DiseaseSymptomJoin ds
ON d.DiseaseID = ds.DiseaseID
INNER JOIN Symptoms s
ON ds.SymptomID = s.SymptomID
WHERE s.Symptom
IN (".$symptom1.", ".$symptom2.", ".$symptom3.", ".$symptom4.")";
或者,使用分数聚合:
$sql = "SELECT Disease,
Score
FROM
(SELECT d.DiseaseID,
d.Disease,
Count(*) As score
FROM Diseases d
INNER JOIN DiseaseSymptomJoin ds
ON d.DiseaseID = ds.DiseaseID
INNER JOIN Symptoms s
ON ds.SymptomID = s.SymptomID
WHERE s.Symptom
IN (".$symptom1.", ".$symptom2.", ".$symptom3.", ".$symptom4.")
GROUP BY d.DiseaseID,
d.Disease
) As dT
ORDER BY score DESC";
“最近的”是什么意思?症状匹配的数量或其他情况?@mseifert这是一个场景,我输入了4个症状:1=发烧,2=头痛,3=疲劳,4=关节肿胀。结果是狼疮和麻疹。我只想要狼疮,因为它有4种输入症状,而麻疹只有1种,这就是发烧症状。@jankryss-你为什么要用这样的?输入症状与数据库症状不完全匹配吗?它们确实匹配,我只是对数据进行了多维读取@StevenMoseley@jankryss-更多关注上述问题。您想要的是mysql\u fetch\u assoc
(不是数组)mysql\u查询
已被弃用(请改用mysqli\u查询
)。您没有查询错误的die()
子句。您的$u POST参数没有sql注入保护。“最近”是什么意思?症状匹配的数量或其他情况?@mseifert这是一个场景,我输入了4个症状:1=发烧,2=头痛,3=疲劳,4=关节肿胀。结果是狼疮和麻疹。我只想要狼疮,因为它有4种输入症状,而麻疹只有1种,这就是发烧症状。@jankryss-你为什么要用这样的?输入症状与数据库症状不完全匹配吗?它们确实匹配,我只是对数据进行了多维读取@StevenMoseley@jankryss-更多关注上述问题。您想要的是mysql\u fetch\u assoc
(不是数组)mysql\u查询
已被弃用(请改用mysqli\u查询
)。您没有查询错误的die()
子句。您的$u POST参数上没有sql注入保护。如果我加上括号,那么我无法获得其他疾病,它将只检索具有4种症状的疾病,并将其匹配到我看到的数据库中。。。您似乎需要全文索引创建全文索引ix_疾病症状(症状1、症状2、症状3、症状4);先生,我会为这个创建另一个表吗?然后插入我的症状数据?不,您将在现有表上创建一个索引,这将使列可以使用全文查询进行搜索。好的,我已经这样做了,但是。先生,您的查询有一个错误。如果我加上括号,那么我就无法获得其他疾病,它将只检索到有4个症状匹配到数据库中的疾病我看到。。。您似乎需要全文索引创建全文索引ix_疾病症状(症状1、症状2、症状3、症状4);先生,我会为这个创建另一个表吗?然后插入我的症状数据?不,您将在现有表上创建一个索引,这将使列可以使用全文查询进行搜索。好的,我已经这样做了,但是。您提供的查询有一个错误,先生。我尝试过,但没有检索到疾病,即使我在数据库中输入了3个匹配的症状。我尝试过,但没有检索到疾病,即使我在数据库中输入了3个匹配的症状