MySQL选择没有关联条目的条目(在另一个表中)

时间:2012-07-13 16:55:53

标签: php mysql sql search

我正在为一家公司制作一个自定义在线管理应用程序,用户可以管理客户,产品,组件,提供商等。现在我正在编写一个搜索表单,用户可以使用关键字和各种选项搜索客户。现在,对于关键字搜索,我知道如何使用MySQL FullText,问题与额外的搜索选项更相关。

基本上,每个客户都可以分配到一个或多个类别。客户端也可能不会分配给任何类别。为此,我使用了三个表:

  • “clients”表,其中包含客户的基本信息,例如姓名,联系信息等。每个客户都有唯一的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_assign”表中创建一个条目,其中“categoryId”设置为0,表示“没有类别”,所以我只需要搜索“categoryId”0。如果可能的话,我希望避免这样做。

有人有任何线索吗?

提前致谢!

2 个答案:

答案 0 :(得分: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子句。这就是为了消除由于客户可能被分配到您正在寻找的多个类别而产生的重复记录。

答案 1 :(得分:0)

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

这将返回未出现在categories_assign表中的所有客户端。如果您还要同时搜索包含类别的客户,只需UNION此查询和您的查询。