这个想法是创建一个搜索框来搜索项目,然后通过选择标签来缩小搜索范围. (某种多面搜索).
摆弄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 …