mysql连接查询多次给出相同的结果

前端之家收集整理的这篇文章主要介绍了mysql连接查询多次给出相同的结果 前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我有两张桌子.一种是物品,另一种是标签.查询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 …

猜你在找的MySQL相关文章