在SQL中搜索数据

时间:2014-07-25 11:29:02

标签: mysql sql

请查看下表:

MySQL Table with results

我正在构建一个搜索引擎,根据对card_idcategory_id值的搜索,返回value_id个值。

为了更好地解释搜索机制,假设我们试图通过提供汽车应该在每个类别({{1})中的哪个部分(card_id)来查找汽车(value_id)。 })。

例如,我们可能想要找到一辆汽车(category_id),其中“燃料类型”类别(card_id)的值为“柴油”(category_id)和类别“Gearbox”(value_id)的值为“Manual”(category_id)。

我的问题是我的知识不足以构建查询,该查询将返回包含多对value_idcard_id的{​​{1}}个。

例如,如果我想用柴油发动机搜索汽车,我可以建立一个这样的查询:

category_id

其中value_id是“燃料类型”类别,SELECT card_id FROM cars WHERE category_id=1 AND value_id=2是“柴油”。

我的问题是,我如何构建一个查询,它将寻找更多的类别 - 值对?例如,我想寻找带手动变速箱的柴油车。

任何帮助将非常感谢。提前谢谢。

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。

SQL Fiddle

答案 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 ))