表:用户
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);
哪一个最适合您的应用程序取决于许多因素,例如表的大小、查询中的其他条件等……我会根据您的特定需求来评估它们。