2014-04-15 158 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 –