Скажем, у меня есть таблица базы данных со следующей структурой
Таблица Запись :
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-in-SELECT в отношении масштабируемости. Есть идеи, как сделать это чисто? Можно ли это сделать с помощью JOIN?