表:用户
| ID | 编译ID |
|---|---|
| 1 | 补偿1 |
| 2 | 补偿1 |
表:公司
| ID | 姓名 |
|---|---|
| 补偿1 | 可乐 |
| 补偿2 | 百事可乐 |
需要一个 MYSQL 查询,只有当它有一个或多个用户时,它才应该获取公司记录,当传递一个公司 ID 时。我将在公司表上有其他条件。
这可以通过连接来实现吗?
示例 1:查询(comp1)结果:可乐(至少存在一个用户)
示例2:查询(comp2)结果:没有记录(因为不存在属于comp2公司的用户)
您要求的称为semi-join。company如果 中有一个或多个匹配行,则返回一行user。
如果您使用常规联接:
SELECT c.* FROM company c JOIN user u ON u.compid = c.id;
这确实会从公司返回该行,但您可能不喜欢它为每个用户返回一行。即结果中的行乘以匹配数。
对此有几种可能的解决方法,以将结果减少到每家公司一行。
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);
哪一个最适合您的应用程序取决于许多因素,例如表的大小、查询中的其他条件等……我会根据您的特定需求来评估它们。