如何匹配mysql中n个属性

如何匹配mysql中n个属性,mysql,database,loops,join,Mysql,Database,Loops,Join,我有一个数据库,我在其中存储症状和论文id(在哪篇论文中使用了什么症状)一篇论文中可以有许多症状,而许多论文都有一个症状 实际上,我正在制作一个程序,用户在其中输入n个症状,然后程序将返回具有所有症状的纸张。 现在假设我硬编码,用户只能输入两个症状,因此我可以为此编写此类代码,例如: SELECT paper_id ,symptom_name FROM My_table WHERE (symptom_name= "" AND symptom_name= "") 现在我想知道,如果我不知道用户将

我有一个数据库,我在其中存储症状和论文id(在哪篇论文中使用了什么症状)一篇论文中可以有许多症状,而许多论文都有一个症状

实际上,我正在制作一个程序,用户在其中输入n个症状,然后程序将返回具有所有症状的纸张。 现在假设我硬编码,用户只能输入两个症状,因此我可以为此编写此类代码,例如:

SELECT paper_id ,symptom_name FROM My_table
WHERE (symptom_name= "" AND symptom_name= "")
现在我想知道,如果我不知道用户将输入多少症状,该怎么办 若用户输入n个症状,那个么我的查询将匹配所有n个症状并给出结果

简单地说,这个查询是针对两个症状的。如何使它适用于n个症状。

您可以使用一个表达式:

SELECT paper_id ,symptom_name 
FROM My_table
WHERE symptom_name IN ("symptom1", "symptom2", "symptom3", "symptom4")
这将提供包含任何症状的文件。如果您想要包含所有症状的论文,您需要这样的查询:

SELECT paper_id
FROM My_table
WHERE symptom_name IN ("symptom1", "symptom2", "symptom3", "symptom4")
GROUP BY paper_id
HAVING COUNT(DISTINCT symptom_name) = 4

你需要三张不同的桌子

  • papers
    包含字段
    papers\u id
    (主键)、名称、标题等
  • 症状
    包含字段
    症状_id
    (主键)、名称等
  • 纸张症状
    包含其主键、
    纸张id
    症状id
每篇论文在
论文
中有一行,每个症状在
症状
中有一行

如果具有
纸张id
1的纸张链接到两个症状(例如,具有
症状id
值6和7),则
纸张id
表将获得两行:

paper_symptom_id  paper_id  symptom_id
(autogenerated)   1         6
(autogenerated)   1         7
然后,要查询给定论文的症状详细信息,需要进行如下查询:

select s.*
from papers p
inner join paper_symptoms ps
on ps.paper_id = p.paper_id
inner join symptoms s
on s.symptom_id = ps.symptom_id
where p.paper_id = 1

您可以使用内部联接作为每个症状的查询结果的交集

SELECT distinct paper_id
FROM My_table as t1
inner join My_table as t2
WHERE t1.symptom_name= "Symtom_1" and t2.symptom_name= "Symtom_2"

对于您问题中的SQL,您需要使用
而不是
您对所有症状感兴趣吗?谢谢,但我不知道症状的数量,因此如何在此查询中动态输入n个症状,例如。在您的查询中有四个症状,但如果用户输入3个症状或五个症状会怎么样。我希望你能理解我如何循环这个症状部分。@Sameeruddin你能不能不在运行中生成查询,而只在表达式中使用用户输入的症状列表?@ZeshanKhan感谢你指出这一点。从这个问题上看,什么是必需的还不是100%清楚,但重新阅读后,我可以看出,
可能是必需的。我已经添加了一个可执行该功能的替代查询。@Nick现在它看起来很完美。您需要为您的
JOIN
添加一个条件,否则它将是一个交叉连接,将每张纸张与其他纸张配对。