以下是一般设置。
我有表Cards
,Attributes
,以及它们之间的连接表。 (我们称之为Tags
。它包含CardID
和AttributeID
。)Attributes
表主要是HasPower
,{{1}等描述},IsPoisonous
等
如何查询同时为ImmuneToWater
和IsPoisonous
的所有卡片?假设我已经有了那些已经存在的ID(13和45),所以从技术上讲,IsElectric
表不需要是这个SQL的一部分。我编造了这样的东西,但我甚至不确定它是否是最佳的。
Attributes
我希望我的问题有道理。基本上,假设您正在查看Web UI;您正在筛选约5000张卡片并希望过滤掉您的结果。所以,你开始复选框:“Poisonous”,“Electric”,“Immune to Water”等。然后根据这些属性过滤掉结果。
思想?
答案 0 :(得分:3)
SELECT *
FROM Cards
WHERE (Cards.Id IN (
SELECT DISTINCT CardID
FROM Tags
WHERE AttributeID IN (13, 45)
GROUP BY CardID
HAVING (COUNT(AttributeID) >= 2)
))
内部查询获取至少具有您指定的两个属性的CardID,然后将该结果用作过滤器以获取外部查询中的实际卡数据。
答案 1 :(得分:1)
虽然您可以使用多个JOIN,但我建议您重新设计数据库,以便属性只是Cards表中的列。