我有两张桌子。一个是items
,一个是tags
。查询here。
我们的想法是创建一个搜索框来搜索项目,然后通过选择标签缩小搜索范围。 (某种分面搜索)。
在摆弄了mysql教程后,我想出了这个:
SELECT `items`.`id`, `items`.`name`, `items`.`pay`, `items`.`desc`
FROM `items`LEFT JOIN (`tags`) ON (`tags`.`item_id`=`items`.`id`)
WHERE (
(`tags`.`type`='food' AND `tags`.`name`='pizza')
OR (`tags`.`type`='drinks' AND `tags`.`name`='lemonade')
--And so on for every tag
)
ORDER BY `pay` DESC LIMIT 0 , 30
(我删除了查询中的全文搜索,因为它现在不相关)
它工作得很好,但我有两个问题:
是否可以使用不同的mysql查询解决这些问题?或者我应该在PHP代码中修复这些问题。 (或者我完全错了,是否有更好的方法来使用标签?)
希望我能说清楚。
GR,
BAS
答案 0 :(得分:2)
在SELECT?
之后输入关键字DISTINCTSELECT DISTINCT `items`.`id`, `items`.`name`, `items`.`pay`, `items`.`desc`
FROM `items`LEFT JOIN (`tags`) ON (`tags`.`item_id`=`items`.`id`)
WHERE (
(`tags`.`type`='food' AND `tags`.`name`='pizza')
OR (`tags`.`type`='drinks' AND `tags`.`name`='lemonade')
--And so on for every tag
)
ORDER BY `pay` DESC LIMIT 0 , 30
至于你的第二个问题......你的逻辑是错的。如果我理解你正确你想按items.id分组,然后拒绝没有返回的项目与所选标签的数量相同的行数...可能是这样的:
SELECT DISTINCT `items`.`id`, `items`.`name`, `items`.`pay`, `items`.`desc`
FROM `items`LEFT JOIN (`tags`) ON (`tags`.`item_id`=`items`.`id`)
WHERE (
(`tags`.`type`='food' AND `tags`.`name`='pizza')
OR (`tags`.`type`='drinks' AND `tags`.`name`='lemonade')
--And so on for every tag
)
GROUP BY `items`.`id`
HAVING COUNT(*) = 2
ORDER BY `pay` DESC LIMIT 0 , 30
...并将HAVING COUNT(*)= 2中的2替换为您尝试同时匹配的标签数量...
答案 1 :(得分:1)
尝试WHERE tag.id IN(SUBQUERY)
SELECT `items`.`id`, `items`.`name`, `items`.`pay`, `items`.`desc`
FROM `items` WHERE items.id IN (SELECT DISTINCT item_id
FROM tags
WHERE (
(`tags`.`type`='food' AND `tags`.`name`='pizza')
OR (`tags`.`type`='drinks' AND `tags`.`name`='lemonade'))
--And so on for every tag
)
ORDER BY `pay` DESC LIMIT 0 , 30