2014-04-15 110 views
0

背景:SQL查询 - 限制的结果,如果没有匹配

这是搜索分贝十足的产品的查询和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不匹配,我想排除这些结果。

我需要在这个内部做另一个选择语句来实现这个吗?希望这是有道理

+0

你能澄清你的问题吗? tags_gifts_occasion_specific的用途是什么? –

+0

对不起 - 该表格用于存储gift_id,只有在用于查找它们的标签与搜索到的标签相匹配时才会出现在搜索结果中。例如。如果有人搜索但没有输入标签(关键字),那么产品将不会出现。但是,如果他们搜索与标签匹配的“母亲节”,则会显示这些项目。这允许与特殊日子有关的产品在通用搜索中被忽略,例如“红色”。搜索'红'的用户不会看到任何“母亲节”的礼物,即使他们也匹配'红' –

+0

是否有另一种搜索方式(除了tag_id)? –

回答

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的帮助 - 这是你的回答,让我朝着正确的方向前进:-)

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 
+0

谢谢。它适用于没有输入任何关键字的搜索,但是当搜索到关键字时不起作用。下面的SQL是搜索'蜡烛(971)',但'婚礼'标签需要排除。所有这一切是显示我想要的排除:SELECT * FROM gifts LEFT JOIN tags_gifts_occasion_specific AS os ON gifts.gift_id = os.gift_id LEFT JOIN tags_gifts ON tags_gifts.gift_id = gifts.gift_id LEFT JOIN tags on tags.id = AND((tags_gifts.tag_id ='971')) AND(os.tag_id ='576'or os.tag_id ='1689') GROUP BY gifts.gift_id –