我有两张桌子.一种是物品,另一种是标签.查询的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
(我删除了查询中的全文搜索,因为它现在不相关了)
它工作得很好,但是我有两个问题:
>如果用户未选择任何标签,则每个附加了1个以上标签的商品都会显示1次以上 >例如,如果用户选择食物=>比萨饼和饮料=>柠檬汁这两个标签,则每个带有比萨饼或柠檬水或两者都显示的项目将显示,我只希望同时贴有两个标签的项目.
是否可以使用其他mysql查询解决这些问题?还是应该在php代码中解决这些问题. (或者我这样做是完全错误的,还有使用标记的更好方法吗?)
希望我能说清楚.
,
巴斯
最佳答案
在SELECT之后输入关键字DISTINCT?
SELECT DISTINCT `items`.`id`,`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`.`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 …
(编辑:应用网_丽江站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|