【问题标题】:MySQL Select entry with no associated entry(in another table)MySQL 选择没有关联条目的条目(在另一个表中)
【发布时间】:2012-07-13 16:55:53
【问题描述】:

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

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

  • “clients”表,保存客户的基本信息,如姓名、联系方式等。每个客户都有一个唯一的ID
  • “categories”表,只有 ID、title 和 description 字段
  • “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。我'如果可能的话,希望避免这样做。

有人有线索吗?

提前致谢!

【问题讨论】:

  • 请提供示例数据和所需的输出。

标签: php mysql sql search


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

【讨论】:

  • 我认为这比我的回答要好,因为它只需要一个查询。
  • 非常感谢,这确实很好用!事实上,我尝试过类似的方法,但我不知道我可以使用“IS NULL”,我尝试使用“c.id != NULL”,但它显然不起作用:) 编辑: 编辑前已回复:D
【解决方案2】:
SELECT * FROM clients c 
WHERE c.id NOT IN (SELECT DISTINCT a.clientID FROM categories_assign a)

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

【讨论】:

  • 谢谢,它有效!但是,我认为 Chaos 的解决方案更好,因为它使用单个查询并且不会选择整个表来最终返回很少的结果。不过还是谢谢!
猜你喜欢
  • 2021-10-31
  • 1970-01-01
  • 2021-04-08
  • 1970-01-01
  • 2011-05-09
  • 2012-06-10
  • 2011-05-03
  • 1970-01-01
相关资源
最近更新 更多