Получение набора всех N-х дочерних элементов

StackOverflow https://stackoverflow.com/questions/2036166

  •  19-09-2019
  •  | 
  •  

Вопрос

Ситуация:

  • 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 и поместите идентификаторы в таблицу для простого обновления при отправке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top