1

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

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

  • “clients”表,保存着客户的基本信息,如姓名、联系方式等。每个客户都有一个唯一的ID
  • "categories" 表,它只包含 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。我想避免这样做的需要,如果可能的话。

有人有任何线索吗?

提前致谢!

4

2 回答 2

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

于 2012-07-13T17:20:07.750 回答
0
SELECT * FROM clients c 
WHERE c.id NOT IN (SELECT DISTINCT a.clientID FROM categories_assign a)

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

于 2012-07-13T17:18:26.280 回答