请查看下表:
我正在构建一个搜索引擎,根据对card_id
和category_id
值的搜索,返回value_id
个值。
为了更好地解释搜索机制,假设我们试图通过提供汽车应该在每个类别({{1})中的哪个部分(card_id
)来查找汽车(value_id
)。 })。
例如,我们可能想要找到一辆汽车(category_id
),其中“燃料类型”类别(card_id
)的值为“柴油”(category_id
)和类别“Gearbox”(value_id
)的值为“Manual”(category_id
)。
我的问题是我的知识不足以构建查询,该查询将返回包含多对value_id
和card_id
的{{1}}个。
例如,如果我想用柴油发动机搜索汽车,我可以建立一个这样的查询:
category_id
其中value_id
是“燃料类型”类别,SELECT card_id FROM cars WHERE category_id=1 AND value_id=2
是“柴油”。
我的问题是,我如何构建一个查询,它将寻找更多的类别 - 值对?例如,我想寻找带手动变速箱的柴油车。
任何帮助将非常感谢。提前谢谢。
答案 0 :(得分:2)
您可以使用聚合和having
子句来执行此操作:
SELECT card_id
FROM cars
GROUP BY card_id
HAVING SUM(category_id = 1 AND value_id = 2) > 0 AND
SUM(category_id = 3 and value_id = 43) > 0;
having
子句中的每个条件都计算与给定条件匹配的行数。您可以根据需要添加任意数量的条件。例如,第一行表示至少有一行,其中类别为1,值为2。
答案 1 :(得分:1)
另一种方法是创建一个用户定义的函数,该函数获取属性/值对的表并返回匹配汽车的表。这样做的好处是可以在不使用动态SQL的情况下允许任意数量的属性/值对。
--Declare a "sample" table for proof of concept, replace this with your real data table
DECLARE @T TABLE(PID int, Attr Int, Val int)
--Populate the data table
INSERT INTO @T(PID , Attr , Val) VALUES (1,1,1), (1,3,5),(1,7,9),(2,1,2),(2,3,5),(2,7,9),(3,1,1),(3,3,5), (3,7,9)
--Declare this as a User Defined Table Type, the function would take this as an input
DECLARE @C TABLE(Attr Int, Val int)
--This would be populated by the code that calls the function
INSERT INTO @C (Attr , Val) VALUES (1,1),(7,9)
--The function (or stored procedure) body begins here
--Get a list of IDs for which there is not a requested attribute that doesn't have a matching value for that ID
SELECT DISTINCT PID
FROM @T as T
WHERE NOT EXISTS (SELECT C.ATTR FROM @C as C
WHERE NOT EXISTS (SELECT * FROM @T as I
WHERE I.Attr = C.Attr and I.Val = C.Val and I.PID = T.PID ))