2009-06-17 54 views
1

我正在爲一個共享主機環境中的一個網站做了一些工作,這個共享主機環境有一個翻轉設置的歷史記錄。本週,更新腳本突然停止工作,其根本原因是用於返回結果的NOT IN子句不再執行此操作。MySQL「不在」查詢突然停止返回結果

查詢,在其本質,是這樣的:

SELECT * 
FROM db1.entry 
where entry_id not in 
(
    select entry_id from db2.content 
) 

我可以確認,確實有應該由兩個表直接檢查返回的記錄。當運行以下兩個查詢,第一個返回entry_ids第二不會:

SELECT * 
FROM db1.entry 
order by entry_id desc 

SELECT * 
FROM db2.content 
order by entry_id desc 

並再次重申,這是所有幾個月正常工作。沒有進行任何代碼更改,但可能會改變MySQL設置。在PHP環境中更改某些內容也是可能的,但這似乎不太可能,因爲從phpMyAdmin運行時,與從實時站點運行時相同,查詢有問題。

而且,當然,它仍然可以在我的開發盒上完美工作。

生活網站運行MySQL版本4.1.11。我的問題是,有沒有人知道該版本的MySQL設置會改變這些NOT IN查詢的工作方式?

謝謝。

回答

5

確保你的內部查詢不返回NULL's。

documentation

爲了符合SQL標準,IN回報NULL不僅如果在左側的表達式是NULL,而且如果不匹配,在列表中找到和的一個列表中的表達式是NULL

+0

我實際測試同時在子查詢無效檢查查詢,並沒有幫助。只有在我回復了你的評論之後,更新了我的問題以包含一個NOT NULL,並重新嘗試了它實際上的工作。 看起來這是救援的「老闆效應」。直到你展示給老闆之前,沒有什麼能夠打破。如果你在互聯網上詢問它們,破碎的東西會自行修復。 謝謝! – 2009-06-17 13:29:26

1

你可能有一個NULL值的至少一個行中entry_id 使用LEFT JOIN或NOT EXISTS代替