如何匹配mysql中n个属性
我有一个数据库,我在其中存储症状和论文id(在哪篇论文中使用了什么症状)一篇论文中可以有许多症状,而许多论文都有一个症状 实际上,我正在制作一个程序,用户在其中输入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= "") 现在我想知道,如果我不知道用户将
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
添加一个条件,否则它将是一个交叉连接,将每张纸张与其他纸张配对。