2012-07-13 45 views
1

我正在爲一家公司定製在線管理應用程序,用戶可以在其中管理客戶端,產品,組件,提供商等。現在我正在使用搜索表單,用戶可以使用關鍵字和各種選項搜索客戶。現在,對於關鍵字搜索,我知道如何使用MySQL FullText,問題更多地與額外的搜索選項有關。MySQL選擇沒有關聯條目的條目(在另一個表中)

所以基本上,每個客戶端可以分配到一個或多個類別。客戶也可能不會被分配到任何類別。要做到這一點,我用三個表:

  • 「客戶」表,其中包含了客戶端,如姓名,聯繫方式等。每個客戶的基本信息都有一個唯一的ID
  • 「類別」表,其中只有ID,標題和說明字段
  • 「categories_assign」表,它只有兩個字段,「clientId」和「categoryId」。它允許我將多個類別分配給客戶端。

現在,在搜索表單中,用戶可以選擇要搜索的類別;可以一次選擇多個類別以及一個「無」值,該值應該搜索沒有類別的客戶。沒有任何類別的客戶基本上在「categories_assign」表中沒有任何條目。

這是我的問題:我沒有問題,尋找分配給特定類別的客戶,但我不能找到一種方法來搜索客戶端,而類..

下面是一個簡化版本(爲了提高可讀性)的查詢,根據所選類別選擇客戶:

SELECT * FROM clients c, categories_assign a WHERE c.id = a.clientId AND a.categoryId IN(1,7,43,52) 

所以如你所料,分配給類別ID 1,7,43或52這樣做此選擇的客戶端工作正常。但是,正如我之前所說,我無法找到一種方法來選擇沒有類別的客戶,即。在「categories_assign」表中沒有任何條目的客戶端。我希望能夠同時選擇特定類別。 (例如,搜索類別ID 1,7,43,52和沒有類別的客戶端)。我嘗試使用連接,但沒有運氣。

我能想到的唯一解決方法是在「categories_dis」表中創建一個條目,將「categoryId」設置爲0,意思是「無類別」,所以我只需要搜索「categoryId」0。如果可能的話,我想避免這樣做的需要。

有沒有人有任何線索?

在此先感謝!

+0

請提供樣本數據和期望的輸出。 – RedFilter 2012-07-13 16:58:27

回答

1
SELECT DISTINCT c.* 
FROM clients c 
LEFT JOIN categories_assign a ON c.id = a.clientId 
WHERE a.id IS NULL 
OR a.categoryId IN (1, 7, 43, 52) 

a.id IS NULL獲得那些沒有類別分配的人。 a.categoryId IN (...)獲得分配給這些類別的人。

如果您僅爲獲取未歸類記錄而編寫查詢,則不需要DISTINCT子句。這只是爲了消除客戶端可能被分配到多個類別中的重複記錄。

+2

我認爲這比我的回答好,因爲它只需要一個查詢。 – Jodaka 2012-07-13 17:31:31

+0

非常感謝,這確實很好!其實,我試過類似的東西,但我不知道我可以使用「IS NULL」,我嘗試過使用「c.id!= NULL」,但顯然不能正常工作:) **編輯: **編輯前回復:D – HCkev 2012-07-13 17:42:36

0
SELECT * FROM clients c 
WHERE c.id NOT IN (SELECT DISTINCT a.clientID FROM categories_assign a) 

這將返回誰不會出現在categories_assign表中的所有客戶。如果您還想同時搜索具有類別的客戶,只需要UNION此查詢和您的查詢。

+0

謝謝,它的工作原理!不過,我認爲混沌的解決方案更好,因爲它使用單個查詢,並且不會選擇整個表以最終返回少量結果。不過謝謝! – HCkev 2012-07-13 17:47:21

相關問題