0

我在 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 中计算。谢谢或您的帮助。如果您遇到问题,您可能想阅读此问题

4

1 回答 1

1

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

像这样的东西:

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

我没有对其进行测试,但是与此类似的一些方法可能对您有用。

于 2012-04-08T17:06:20.263 回答