具有联接表和来自 GET 参数的多个值的高级查询
Posted
技术标签:
【中文标题】具有联接表和来自 GET 参数的多个值的高级查询【英文标题】:Advanced query with joined tables and multiple values from GET parameter 【发布时间】:2016-06-18 22:31:50 【问题描述】:首先,我将解释我最终想要发生的事情,所以如果你不能帮助我,你不要浪费你的时间阅读所有这些:)
我正在创建一个 API,它会根据用户提交的症状输出用户可能患有的疾病。
我希望用户输入一些内容,这会作为“症状=... 比如:.../nameofmyapi/data?symptoms=headache+dizzyness。我从 GET 参数中检索数据,但我完全不知道如何输出疾病名称。
我的数据库如下所示:
疾病
illnessId (int(11), AUTO_INCREMENT) 病名(varchar(255))症状
symptomId (int(11), AUTO_INCREMENT) 症状名称 (varchar(255))疾病症状
illnessId(来自疾病表) symptomId(来自症状表)此数据库设计确保您不会在 1 行中获得多个值并且没有相同的值但是就像我说的那样,我不知道如何根据其他值“搜索”或“过滤”疾病桌子。更不用说要检查多种症状了...似乎是不可能的!
我有这个查询,所以当用户没有输入任何内容时我可以检索所有内容:
"SELECT illness.illnessId, illness.illnessName, symptom.symptomName FROM illness_symptom
JOIN illness
ON illness.illnessId = illness_symptom.illnessId
JOIN symptom
ON symptom.symptomId = illness_symptom.symptomId";
这给了我这个: image
就像我说的,我只想在 url 看起来像这样时输出“Whiplash”:/nameofmyapi/data?symptoms=dizzyness+headache
我们将不胜感激!
【问题讨论】:
【参考方案1】:首先:只输出“Whiplash”是行不通的,因为您的其他疾病也与“头晕”症状有关。
我已经使用您的结构创建了一个数据库(仅重命名字段以具有更多默认约定。还会查看您的表名以使其复数)并提出以下查询:
SELECT i.id, i.name
FROM illness_symptom AS ils
JOIN illness AS i ON i.id = ils.illness_id
JOIN symptom AS s ON s.id = ils.symptom_id
WHERE s.name IN ('dizzyness', 'headache')
GROUP BY i.name
IN 部分搜索您的表格并过滤掉具有不同症状的所有其他结果。您可以将 GET 查询的结果转换为查询中使用的逗号分隔列表。
GROUP BY 部分可确保您不会得到任何双重结果。当然,您需要确保一个结果只存在于您的数据库中一次(没有具有不同大小写的双重记录,例如“whiplaSh”)。
希望这会有所帮助!
【讨论】:
感谢安特万!我无法让 WHERE .. IN 在我的查询中工作,但现在它工作得很好!不是所有的英雄穿着斗篷! :)以上是关于具有联接表和来自 GET 参数的多个值的高级查询的主要内容,如果未能解决你的问题,请参考以下文章
无法在具有聚合值的 HAVING 子句中使用来自子查询表连接的单值列