Получение набора всех N-х дочерних элементов
Вопрос
Ситуация:
- MySQL 5.0
- 2 стола
- Отношения внешнего ключа «один-ко-многим» родитель-потомок (A.ID = B.PARENT_ID)
Что необходимо:
- Запрос SELECT, который возвращает набор всех N-х дочерних элементов (отсортированных по их идентификаторам).
- Также нужна форма для использования в UPDATE
Пример:
Таблица Б
| ID | PARENT_ID |
------------------
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 2 |
| 6 | 2 |
| 7 | 2 |
| 8 | 3 |
| 9 | 3 |
| 10 | 4 |
Набор желаемых результатов, например, для всех вторых детей
| A.ID | B.ID | B.PARENT_ID |
-----------------------------
| 1 | 2 | 1 |
| 2 | 5 | 2 |
| 3 | 9 | 3 |
Возможно, что-то связано с функцией GROUP BY, которую я не вижу?
Мой разум полностью застрял в поиске процедурного решения этой проблемы.Вся помощь очень ценится.
Решение
Дон прав: MySQL не имеет функции ранжирования.Но, к счастью, он позволяет вам инициализировать переменную и ссылаться на нее, чтобы вы могли запрограммировать логику ранжирования.
Это вернет строки для 2-го дочернего элемента:
SELECT x.aid,
x.bid,
x.parent_id
FROM (SELECT a.id 'aid',
b.id 'bid',
b.parent_id,
CASE WHEN b.parent_id = @parent_id THEN @rownum := @rownum +1 ELSE @rownum := 1 END AS rownum,
@parent_id := b.parent_id
FROM TABLE_A a
JOIN TABLE_B b ON b.parent_id = a.id
JOIN (SELECT @rownum := 0, @parent_id := NULL) r
ORDER BY b.parent_id, b.id) x
WHERE x.rownum = 2
Изменить WHERE x.rownum = ?
любым детям N-го уровня, которые вы хотите.А ORDER BY
в подзапросе важно убедиться, что рейтинг получается правильно.
Мне не ясно, как вы хотите использовать это для UPDATE
запрос — предоставьте более подробную информацию, и я обновлю его в соответствии с вашими потребностями.
Другие советы
MySQL не имеет механизма для выполнения этого N-го отношения.У Oracle есть расширение и, возможно, другие.
Каков контекст?
Если вы создаете HTML-форму для обновления, сгенерируйте данные с помощью цикла for и поместите идентификаторы в таблицу для простого обновления при отправке.