我有一个 Select 给定分支机构用户的查询.

SELECT u.first, u.last, u.id, 
    (SELECT u1.user_type
    FROM users_branches AS u1
    WHERE u.id = u1.user_id AND u1.branch_id = @foo
    LIMIT 1)
FROM users AS u
WHERE EXISTS
    (SELECT 1
    FROM users_branches AS u0
    WHERE u.id = u0.user_id AND u0.branch_id = @foo)

下面是生成该SQL的EF Core LINQ查询.

int branchId = 123;
var users = await Users
    .Where(x => x.UsersBranches.Any(ub => ub.BranchId == branchId))
    .Select(user => new
    {
        UserId = user.Id,
        FirstName = user.First,
        LastName = user.Last,
        UserType = user.UsersBranches.FirstOrDefault(x => x.BranchId == branchId).UserType
    }).ToListAsync();

我不喜欢重复WHERE子句,只是说"只为我获取具有该分支的USERS_BRANKS记录的用户,并从该记录返回一些数据".有没有更有效的方法来做到这一点?我可以想象使用GROUP BY的解决方案,但我不确定这实际上是否会更好.

推荐答案

其中一种方法是使用joins

SELECT u.id AS UserId, u.first AS FirstName, u.last AS LastName 
FROM users u
INNER JOIN users_branches ub ON u.id = ub.user_id
WHERE ub.branch_id = 123

另一种方法是使用subquery

SELECT u.id AS UserId, u.first AS FirstName, u.last AS LastName
FROM users u 
WHERE u.id IN (
  SELECT user_id 
  FROM users_branches 
  WHERE branch_id = 123
)

如果您看到主要区别在于连接版本在一条语句中查询两个表,而子查询版本在查询用户之前首先在子查询中过滤UsersBranch.

Note:The join is generally more efficient since it allows the database to access both tables at once and optimize the query plan. The subquery can result in slower performance since it splits the query into two parts.

--希望这能有所帮助.

Mysql相关问答推荐

mysql查询汇总数据

慢查询日志(log)甚至包括快速查询,因为它包括等待锁定所花费的时间

如何跨多个产品查找相同时间范围的数据集

如何合并有多行的json列

如何从MySQL数据库中提取入职第一个月的工作天数?

没有 ORDER BY 的查询性能很高,有 ORDER BY 的查询速度慢得像爬行一样

如何将多个字符串插入变量

SQL使用LIMIT获取结果和结果中的行数

如何计算每行的剩余金额?

MySQL:从 n 个关系表中 Select 所有具有 MAX() 值的行

使用 DISTINCT 时无法从数据库中查询所有数据

如何使用 SQL 聚合和求和相似 Select 的值?

如何在 Mysql 中创建复合外键

使用 MySQL LIMIT、OFFSET 进行分页

授予用户对 MySQL 中有限数量表的访问权限

有什么方法可以显示`gunzip < database.sql.gz | 的进度? mysql ...`进程?

将 Django DB 从 SQLite 迁移到 MySQL 的最佳方法是什么?

从mysql中的大表中快速 Select 随机行

SQLSTATE [42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #3 不在 GROUP BY 子句中并且包含非聚合

MySQL讲解查询理解