我有一个“项目”列表,它们都有一个“标题”并包含一组“标签”:
$query = mysql_query("SELECT i.id, i.title
FROM items AS i
LEFT JOIN tag_rel AS tr ON (tr.item = i.id)
LEFT JOIN tags AS t ON (t.id = tr.tag)
$where
GROUP BY i.id
HAVING (GROUP_CONCAT(t.name) LIKE '%$search%')
ORDER by i.id DESC LIMIT 0, 10");
现在有了这个查询,我得到了包含用户$搜索的“标记名称”的所有项目。
但我也希望能够在项目标题内搜索。
我知道我不能只添加:
WHERE i.title LIKE '%$search%'
因为这不允许标签的HAVING起作用。
如何在标记组或项目名称中找到$ search时获得结果?
非常感谢任何想法!
ie. scenario:
$search = 'jeans';
ITEM A)
GROUP_CONCAT(t.name) = 'trousers','long','jeans','skinny';
i.title = 'Skinny Trousers';
ITEM B)
GROUP_CONCAT(t.name) = 'trousers','long','skinny';
i.title = 'Skinny Jeans';
答案 0 :(得分:1)
首先,您的group_concat()
方法不必要地昂贵并且容易出现问题(如果许多名称匹配)。另一种选择更简单:
HAVING max(t.name = $search) = 1;
如果您想匹配两个不同的字段:
HAVING max(t.name = $search) = 1 or max(i.title = $search) = 1;
根据您的数据结构,max()
只会处理一行,但没关系。
答案 1 :(得分:0)
看起来你只是试图结合两组不同的结果:
这应该可以解决问题:
SELECT DISTINCT id, title FROM (
SELECT id, title FROM items
WHERE title LIKE '%$search%'
UNION
SELECT i.id, i.title FROM items i
JOIN tag_rel tr ON tr.item = i.id
JOIN tags t ON t.id = tr.tag
WHERE t.name LIKE '%$search%'
) s
ORDER BY id DESC
LIMIT 0, 10