【问题标题】:Advanced query with joined tables and multiple values from GET parameter具有联接表和来自 GET 参数的多个值的高级查询
【发布时间】: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

我们将不胜感激!

【问题讨论】:

    标签: php sql get


    【解决方案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 在我的查询中工作,但现在它工作得很好!不是所有的英雄穿着斗篷! :)
    猜你喜欢
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    相关资源
    最近更新 更多