具有联接表和来自 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 子句中使用来自子查询表连接的单值列

如何使用包含Swift中相同键的多个值的查询参数构建URL?

具有内部联接、多个分组依据和最小最大值的 Linq 查询

F# - 具有多个返回值的密码查询

具有多个输入的Laravel高级查询

来自三个表的左联接