如何在mysql中匹配n个属性

问题描述 投票:-2回答:3

我有一个数据库,其中我存储症状和纸张ID(在哪纸张使用什么症状)许多症状可以在一篇论文中,许多论文有一个症状。

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

SELECT paper_id ,symptom_name FROM My_table
WHERE (symptom_name= "" AND symptom_name= "")

现在我想知道如果我不知道用户将输入多少症状,如果用户输入n个症状,那么我的查询将匹配所有n个症状并给我结果。

简单地说这个查询是针对两个症状的,我怎么能让它适用于n个症状。

mysql database loops join
3个回答
4
投票

您可以使用IN表达式:

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

1
投票

你需要三个不同的表。

  • papers包含字段paper_id(主键),名称,标题等。
  • symptoms包含字段symptom_id(主键),名称等。
  • paper_symptoms包含其主键paper_idsymptom_id

每篇论文在papers中都有一行,每个症状在symptoms中都有一行。

如果带有paper_id 1的纸张与两个症状相关联(例如symptom_id值为6和7),则paper_symptoms表格会有两行:

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

-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"
© www.soinside.com 2019 - 2024. All rights reserved.