SQL查询 - 如果不匹配,则限制结果

时间:2014-04-15 15:17:18

标签: php mysql sql database phpmyadmin

背景:

这是一个搜索完整数据库的查询,SQL是根据用户搜索的内容构建的。

SELECT *

FROM gifts 

LEFT JOIN tags_gifts ON tags_gifts.gift_id = gifts.gift_id 

LEFT JOIN tags ON tags.id = tags_gifts.tag_id 

WHERE published = '1'
AND ( (tags_gifts.tag_id = '887') ) 

GROUP BY gifts.gift_id 

ORDER BY COUNT(*) DESC , gift_popularity DESC

这是按计划进行的,但是我正在尝试做的下一部分我正在努力。

我有另一个表' tags_gifts_occasion_specific ',其中包含' gift_id '和' tag_id '列

基本上,如果用户搜索上述内容但没有要搜索的tag_id,或者他们搜索过的tag_id与tags_gifts_occasion_specific.tag_id中的tag_id不匹配,那么我想排除这些结果。

我是否需要在此内部执行另一个select语句才能实现此目的?希望这是有道理的

2 个答案:

答案 0 :(得分:1)

试试这个:

SELECT *
FROM gifts AS g
    LEFT JOIN tags_gifts_occasion_specific AS os ON g.gift_id = os.gift_id
    LEFT JOIN tags_gifts ON tags_gifts.gift_id = gifts.gift_id 
    LEFT JOIN tags ON tags.id = tags_gifts.tag_id 

WHERE published = '1'
    AND (os.tag_id IS NULL OR os.tag_id = '887')
    AND tags_gifts.tag_id = '887'

GROUP BY gifts.gift_id 
ORDER BY COUNT(*) DESC , gift_popularity DESC

答案 1 :(得分:0)

最后通过以下方式解决了这个问题:

 AND NOT EXISTS ( SELECT * FROM tags_gifts_occasion_specific WHERE tags_gifts_occasion_specific.gift_id = gifts.gift_id) 

然后对于包含标签的搜索:

AND NOT EXISTS ( SELECT * FROM tags_gifts_occasion_specific WHERE tags_gifts_occasion_specific.gift_id = gifts.gift_id AND tags_gifts_occasion_specific.tag_id != '971' ) 

感谢okio的帮助 - 这是你的回答让我朝着正确的方向前进: - )