【问题标题】:Sql to fetch records only if related other table records existSql 仅在存在相关的其他表记录时才获取记录
【发布时间】:2021-09-22 23:40:15
【问题描述】:

表:用户

id compId
1 comp1
2 comp1

表:公司

id name
comp1 coke
comp2 pepsi

需要一个 MYSQL 查询,只有当它有一个或多个用户时,它才应该获取公司记录,当传递一个公司 ID 时。我将在公司表上有其他 where 条件。

这可以通过join来实现吗?

示例 1:查询(comp1)结果:可乐(至少存在一个用户)

示例2:查询(comp2)结果:没有记录(因为不存在属于comp2公司的用户)

【问题讨论】:

  • 我试过 where exists (select * from user u where u.compId = id),但我还有其他 where 条件会破坏查询。
  • 请通过编辑为您的问题添加所有说明。到目前为止,您尚未在问题中提及任何其他条件
  • 其实是一个很大的查询,有很多其他的表连接,我只是想知道这是否可以通过连接条件而不是使用whereexists子句来实现。

标签: mysql sql semi-join


【解决方案1】:

您所要求的称为半连接。如果user 中有一个或多个匹配行,则从company 返回一行。

如果您使用常规连接:

SELECT c.* FROM company c JOIN user u ON u.compid = c.id;

这确实会返回来自公司的行,但您可能不喜欢它返回一行每个用户。 IE。结果中的行乘以匹配数。

对此有几种可能的解决方法,以将结果减少到每家公司一行。

SELECT DISTINCT c.* FROM company c JOIN user u ON u.compid = c.id;

SELECT c.* FROM company c JOIN (SELECT DISTINCT compid FROM user) u ON u.compid = c.id;

SELECT * FROM company c WHERE c.id IN (SELECT compid FROM user);

SELECT * FROM company c WHERE EXISTS (SELECT * FROM user WHERE compid = c.id);

哪一个最适合您的应用取决于许多因素,例如表的大小、查询中的其他条件等...我会根据您的具体需求来评估它们。

【讨论】:

  • 太好了,我避免在 c.* 第二个查询之前使用 distinct SELECT c.* FROM company c JOIN (SELECT DISTINCT compid FROM user) u ON u.compid = c.id;为我做这项工作,谢谢。
猜你喜欢
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
  • 2016-05-07
  • 2019-11-26
  • 2015-06-25
相关资源
最近更新 更多