假设我有一个如下结构的数据库表
表记录:
id INT NOT NULL (PRIMARY_KEY, AUTO_INCREMENT)
parent INT NOT NULL
priority INT NUL NULL
现在我想选择所有记录,但我需要一个列,使每一行与后续的(基于 priority
,升序) parent
-如果存在,否则 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中的select在可伸缩性方面的问题。你知道怎么干净利落地做吗?可以使用连接吗?
2条答案
按热度按时间jecbmhm31#
假设你对每个父母都有唯一的优先权,我相信这是可行的:
mzaanser2#
这将在这里为您工作,并避免使用您提到的子查询。你可以用电脑做你想做的事
LEFT
加入使空值保持不变,然后把你想要的放在on
例如r1.parent = r2.parent and r2.priority > r1.priority
http://sqlfiddle.com/#!9/3a592/25号