該查詢處理和運行,但它完全忽略了沒有在第的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
該查詢處理和運行,但它完全忽略了沒有在第的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
也許你的「不」查詢返回任何內容。
不應該
where offer_id='o.id'
要
where offer_id=o.id
?
非常感謝您指出了這一點,它的工作完美! –
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
在嵌套查詢「o.id」也許是錯誤的 –