MYSQL多参数搜索

时间:2012-04-08 15:33:11

标签: mysql sql database search

我在MySQL中运行多参数搜索查询时遇到了问题:

    SELECT item.* from item, attr, attr_xref
    WHERE attr_xref.item = item.id
    AND attr.id = attr_xref.attrID
    AND (
      (attr.name = 'city' AND attr.val LIKE '%new york%')
      OR
      (attr.name = 'floor' AND attr.val = 6)
    )

使用php动态生成查询,没有麻烦。

问题是这个查询不会返回严格的搜索。它将返回城市或楼层等于其搜索值的项目。

正如我所看到的那样,问题出现在AND attr.id = attr_xref.attrID此行为具有多个属性的项目返回多个值,删除了我将尝试匹配单个的OR运算符具有多个不同名称和值的属性,但具有一个ID。

有没有办法克服这个问题?

这是一个原始示例,在运行时我可能有超过2,3个搜索参数。

谢谢你,瞧瞧你的帮助!

修改 通过使用在接受的答案中发布的SQL查询来完成它,并添加了这个:

AND (a_city.id IS NOT NULL
OR a_floor.id IS NOT NULL)
GROUP BY imobil.id
HAVING COUNT(*) = 2

您想要对结果进行分组然后对它们进行计数,'= 2'表示已经传递了多少个参数,这将在PHP中计算。谢谢或者你的帮助。 如果您遇到问题,可能需要阅读此question

1 个答案:

答案 0 :(得分:1)

添加两个左连接,它们将创建一个attr.val为“floor”的列,另一个用attr.val为“city”,并检查至少有一个不为null。

这样的事情:

SELECT 
    item.*
FROM 
    item
JOIN 
    attr_xref ON attr_xref.item = item.id
LEFT JOIN 
    attr a_city ON  a_city.id = attr_xref.attrID 
                AND a_city.name = 'city'
                AND a_city.val LIKE '%new york%'
LEFT JOIN
    attr a_floor ON a_floor.id = attr_xref.attrID
                AND a_floor.name = 'floor'
                AND a_floor.val = 6 
WHERE 
    a_city.id IS NOT NULL 
    OR a_floor.id IS NOT NULL

我没有测试它,但是一些类似的方法可能对你有用。