背景:
这是一个搜索完整数据库的查询,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语句才能实现此目的?希望这是有道理的
答案 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的帮助 - 这是你的回答让我朝着正确的方向前进: - )