mysql - 使用 JOIN 避免 SELECT-in-SELECT 语句

标签 mysql sql join select

假设我有一个具有以下结构的数据库表

记录:

id       INT NOT NULL (PRIMARY_KEY, AUTO_INCREMENT)
parent   INT NOT NULL
priority INT NUL NULL

现在我想选择所有记录,但我需要一个列来匹配每一行到具有相同父级的后续(基于priority,升序) > - 如果它存在,否则 NULL。在这个任意示例中,parent 是一个完全外部表的标识符,与记录没有直接关系。

例如数据集:

| id | parent | priority |
|----|--------|----------|
| 1  | 1      | 2        |
| 2  | 1      | 6        |
| 3  | 1      | 1        |
| 4  | 2      | 4        |
| 5  | 2      | 3        |

应该产生以下内容:

| id | parent | priority | match |
|----|--------|----------|-------|
| 1  | 1      | 2        | 2     |
| 2  | 1      | 6        | NULL  |
| 3  | 1      | 1        | 1     |
| 4  | 2      | 4        | NULL  |
| 5  | 2      | 3        | 4     |

一个有效的 SQL 实现是:

SELECT r1.*, 
    (SELECT r2.id 
        FROM record AS r2 
        WHERE r2.parent = r1.parent 
            AND r2.priority > r1.priority 
        ORDER BY r2.priority ASC 
        LIMIT 1
    ) AS match_id
FROM record AS r1

但是,我非常关心 SELECT-in-SELECT 的可伸缩性。关于如何干净地执行此操作的任何想法?可以使用 JOIN 吗?

最佳答案

假设您对每个家长都有独特的优先级,我相信这会奏效:

select r.id, r.parent, r.priority, r2.id as `match`
from (
    select r.id, r.parent, r.priority, min(r2.priority) as next_priority
    from record r
    left join record r2 on
      r.parent = r2.parent
      and r.priority < r2.priority
    group by r.id, r.parent, r.priority
  ) r
left join record r2 on
    r.parent = r2.parent
    and r.next_priority = r2.priority
order by r.id

match是MySQL的保留关键字,所以需要反引号。

这是如何工作的,我们从高于当前优先级的升序中提取下一个优先级,并基于此(以及我们对每个父级都有唯一优先级的事实)我们可以提取相应的行 ID。

Live DEMO - SQL Fiddle

关于mysql - 使用 JOIN 避免 SELECT-in-SELECT 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51102851/

相关文章:

SQL Server - 选择左连接 NULL 记录 WHERE 条件

mysql - 从 LEFT OUTER JOIN 计算 NULL 值,这可能吗?

mysql - 如何从重复结果中获得不同的值(value)

sql - 需要帮助避免在查询中多次(内部)连接使用的 View

mysql - 在 RHEL 上安装的 mysql 中设置 lower_case_table_names=1 ,无需重新安装

sql - 非此即彼列的外键?

mysql - 连接 2 个表,其中公共(public)行具有不同的数据格式

mysql - 链接 MySQL 表中的行

php - 第一个表单提交插入行随后提交更新同一行

php - 在 MAMP 3 中启用日志