使用HAVING OR WHERE?

时间:2013-11-30 17:22:17

标签: mysql sql database-design

我有一个“项目”列表,它们都有一个“标题”并包含一组“标签”:

$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';

2 个答案:

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