2013-01-12 101 views
0

該查詢處理和運行,但它完全忽略了沒有在第的MySQL查詢忽略NOT IN功能

SELECT * FROM `offers` as `o` WHERE `o`.country_iso = '$country_iso' AND `o`.`id` 
not in (select distinct(offer_id) from aff_disabled_offers 
where offer_id = 'o.id' and user_id = '1') ORDER by rand() LIMIT 7 
+2

在嵌套查詢「o.id」也許是錯誤的 –

回答

2

也許你的「不」查詢返回任何內容。

不應該

where offer_id='o.id' 

where offer_id=o.id 

+0

非常感謝您指出了這一點,它的工作完美! –

0

guido有答案...它看起來像你的意思是創建一個相關的子查詢。 'o.id'被視爲文字。

一些注意事項:

在你需要某種形式的擔保,在NOT IN謂詞的子查詢不返回NULL值。如果您沒有從數據庫執行該保證,則在子查詢中添加WHERE/HAVING return_expr IS NOT NULL就足以爲您提供保證。

相關的子查詢會在大集合上吃你的午餐,表現明智。就像那個ORDER BY rand()一樣。

一般而言,反連接模式被證明是更有效的大集:

SELECT o.* 
    FROM offers o 
    LEFT 
    JOIN aff_disabled_offers d 
    ON d.user_id = '1' 
    AND d.offer_id = o.id 
WHERE d.offer_id IS NULL 
    AND o.country_iso = '$country_iso' 
ORDER BY rand() 
LIMIT 7