我如何查询一行是否在另一个表中有N行的外键呢?

时间:2012-02-14 18:18:53

标签: mysql sql

以下是一般设置。

我有表CardsAttributes,以及它们之间的连接表。 (我们称之为Tags。它包含CardIDAttributeID。)Attributes表主要是HasPower,{{1}等描述},IsPoisonous

如何查询同时为ImmuneToWaterIsPoisonous的所有卡片?假设我已经有了那些已经存在的ID(13和45),所以从技术上讲,IsElectric表不需要是这个SQL的一部分。我编造了这样的东西,但我甚至不确定它是否是最佳的。

Attributes

我希望我的问题有道理。基本上,假设您正在查看Web UI;您正在筛选约5000张卡片并希望过滤掉您的结果。所以,你开始复选框:“Poisonous”,“Electric”,“Immune to Water”等。然后根据这些属性过滤掉结果。

思想?

2 个答案:

答案 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表中的列。