MySQL join 以使用顺序/优先级获取单行

标签 mysql join

我在 MySQL 数据库中有几个表

EID        Name      
 1        Title A       
 2        Title B       
 3        Title C       

LID    EID     Location  Address     Order   
1       1      Office      NY          1
2       1      Home        IL          2
3       2      Office      CA          1
4       3      Home        NJ          2

我有以上 2 个表(员工和位置)。我想知道每个以办公室为首选的员工的位置,如果“办公室”不存在,则需要“家庭”位置。 order 列定义了所需内容的顺序/优先级。

这里是需要的输出

EID  LID       Name        Location   Address
 1    1      Title A       Office     NY
 2    3      Title B       Office     CA
 3    4      Title C       Home       NJ

最佳答案

下面查询的第一个连接只是连接 EmployeeLocation 表,但请注意,它会产生 所有 来自的记录>Location 正在加入。以下查询的关键部分是子查询的第二个 INNER JOIN。此子查询确定每个员工 ID 的最小(即最高优先级)顺序。然后,这用于丢弃第一个连接中不是最高优先级的记录。

SELECT t1.EID,
       t2.LID,
       t1.Name,
       t2.Location,
       t2.Address
FROM Employee t1
INNER JOIN Location t2
    ON t1.EID = t2.EID
INNER JOIN
(
    SELECT EID, MIN(`Order`) AS min_order
    FROM Location
    GROUP BY EID
) t3
    ON t2.EID = t3.EID AND
       t2.Order = t3.min_order

另一个注意事项:不要将您的列命名为Order,这是一个MySQL 关键字。为了让我的查询正常工作,我不得不将其放在反引号中,这至少可以说很不方便,而且可能容易出错。

此处演示:

SQLFiddle

关于MySQL join 以使用顺序/优先级获取单行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42016820/

相关文章:

mysql - sql查询年份差异取决于特定月份

mysql - 加入 2 个表进行取款和存款?

python - 从 Django 查询中获取非唯一值

mysql - 抓取 bash 变量输入数据到 MySQL

mysql - DATEDIFF 显示过去 30、60 和 90 天的购买情况

mysql - 将查询中的 NULL 值替换为另一行的值

mysql新手——加入

mysql - 根据组完成数据过滤数据

mysql - 如果在 UNION ALL 查询中找不到任何行,则返回默认值

php - 为空白的 LEFT JOIN 设置 0 结果?