2010-10-26 63 views
1

我有一個使用左連接,像這樣的查詢:MySQL匹配...反對vs. nulllls?

SELECT a.id, a.username, a.date_created, a.contact_id, a.role_id, 
    c.first_name, c.middle_initial, c.last_name, c.email, r.role 
FROM accounts AS a 
LEFT JOIN contacts AS c ON a.contact_id = c.id 
LEFT JOIN roles AS r ON a.role_id = r.id 
WHERE (MATCH (a.username, c.first_name, c.middle_initial, c.last_name, c.email) 
    AGAINST ('searchTerm*' IN BOOLEAN MODE)) 

問題是,有沒有對應的接觸(c.id)或角色(r.id)賬戶(a.id),所以當加入信息出現空(我猜)。

當發生這種情況時,無論發生什麼(在正常結果的頂部),我都會得到與搜索項不匹配的結果,它們都是由連接填充的空值。

我試過不同種類的連接,而且我在網上找過,但是我還沒有找到具體解決這個問題的東西。我認爲這會對其他人有用,因爲我可以看到其他領域出現這種情況。

所以,任何幫助將不勝感激,謝謝!

+0

試過ISNULL()? – Jrud 2010-10-26 21:05:36

+0

我剛剛嘗試ISNULL(c.first_name,0)和我收到了#1582 - 調用本地函數'ISNULL'中的錯誤參數計數我正在使用MySQL 5.1 – Asher 2010-10-26 21:10:12

+0

我認爲你想嘗試IFNULL :) – mna 2010-10-26 21:12:37

回答

1

您需要用emtpy字符串替換NULLS,那麼您不會得到任何虛假匹配。只需匹配COALESCE(c.email, '')(等),而不只是場。

COALESCE將返回它的第一個參數,除非它是NULL,那麼它將返回第二個參數。

+0

感謝您的信息,這有助於一點。另請參閱下面的答案。你的答案中的這些信息也非常有用,謝謝! – Asher 2010-10-26 21:20:46

+0

我試過了,看上面的評論,並沒有奏效。我終於決定設計不同的系統來解決它。感謝您的努力和關注。 – Asher 2010-10-28 04:27:28

0

嘿,夥計們,我注意到了一些我認爲是答案但不是:當我把r.role放到匹配條款中時,問題就解決了。說實話,我並不十分理解邏輯,但我知道這就是讓更多記錄出現的原因,因爲該領域被要求沒有過濾器。

不幸的是,它仍然沒有解決。對不起,提早回答。

+0

對不起,它仍然沒有解決,我仍然遇到同樣的問題,當我運行此查詢: – Asher 2010-10-26 21:27:41

+0

SELECT a.id,a.username,COALESCE(c.first_name,'') 從帳戶AS a LEFT JOIN聯繫人AS c ON a.contact_id = c.id WHERE(MATCH(a.username,c.first_name) AGAINST('searchTerm *'IN BOOLEAN MODE)) – Asher 2010-10-26 21:28:30