2014-10-08 200 views
0

我在查詢正常工作時遇到問題。我覺得這應該很容易,但由於某種原因,我無法正確理解。MYSQL - 不等於不能正常工作

我有兩個表加入了一個ID字段。我試圖獲取所有在t1中的記錄,並且不會在t2中顯示。

此工程目前:

select * from at_templates a 
left join at_vault b on a.id = b.template 
where b.at_id is null 

但是,我也希望把另外一個條件查詢到的數據限制爲一個子集,它不工作:

select * from at_templates a 
left join at_vault b on a.id = b.template 
where b.at_id != 1 

第二個查詢基於at_id的輸入,我想要得到與第一個相同的結果。

任何想法?

+1

目前還不清楚「基於at_id的輸入」的結果與第一個結果相同。你似乎在說你想要一個將返回第一個查詢得到的結果子集的查詢。你不能通過在b.at_id上添加一個附加條件來做到這一點(因爲當前的已經是可選擇的)或者通過改變當前的條件(因爲那樣你就不會獲得子集)。 – 2014-10-08 21:23:17

回答

1

你的工作示例意味着「第一表」你想看到的記錄是從a和「第二臺」您要使用排除記錄是b。如果您是,但不包括b中存在的所有記錄,則不能進一步限制結果集的值,例如b.at_id,因爲在結果集中沒有與b關聯的值。

此外,如果條件b.at_id is null爲真,則條件b.at_id != 1永遠不會成立,因爲an inequality comparison with null will always return null。 (這樣做的原因是,null不是一個值;它是表示一個值的沒有的佔位符。)

如果你想從兩個查詢相同的結果,根據一些用戶之間的比較輸入參數和字段b.at_id(並指出,你的第二個查詢目前返回一個空集),你也許可以通過以下方式使用MySQL's null-safe equality operator

SELECT 
    * 
FROM 
    at_templates AS a 
    LEFT JOIN 
    at_vault AS b ON a.id = b.template 
WHERE NOT b.at_id <=> 1; 

這是一個MySQL擴展,而不是標準的語法;不幸的是,ANSI SQL標準語法IS [NOT] DISTINCT FROM似乎並未得到廣泛支持。 How to rewrite IS DISTINCT FROM and IS NOT DISTINCT FROM?討論了一些替代方法來重寫這種情況。請注意,如果將來您有一些不是1的值b.at_id,那麼此查詢也會返回這些行,而不僅僅是第一個查詢返回的行。