我在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
答案 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
我没有测试它,但是一些类似的方法可能对你有用。