Извлечение набора всех N-х детей - PullRequest
1 голос
/ 10 января 2010

Ситуация:

  • MySQL 5.0
  • 2 стола
  • отношение внешнего ключа «один ко многим родитель-потомок» (A.ID = B.PARENT_ID)

Что нужно:

  • Запрос SELECT, который возвращает набор всех N-х дочерних элементов (отсортированный по их идентификаторам)
  • Также нужна форма для использования в ОБНОВЛЕНИИ

Пример:

Таблица B

| ID | PARENT_ID |
------------------
|  1 |     1     |
|  2 |     1     |
|  3 |     1     |
|  4 |     2     |
|  5 |     2     |
|  6 |     2     |
|  7 |     2     |
|  8 |     3     |
|  9 |     3     |
| 10 |     4     |

Набор желаемых результатов, например, для всех 2-х детей

| A.ID | B.ID | B.PARENT_ID |
-----------------------------
|    1 |    2 |           1 |
|    2 |    5 |           2 |
|    3 |    9 |           3 |

Возможно, что-то делать с функцией GROUP BY, которую я не вижу?

Мой разум полностью застрял, увидев решение этой проблемы процедурно. Вся помощь очень ценится.

Ответы [ 2 ]

2 голосов
/ 10 января 2010

Дон прав - 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 - предоставьте больше деталей, и я обновлю в соответствии с вашими потребностями.

0 голосов
/ 10 января 2010

MySQL не имеет механизма для выполнения этого N-го отношения. У Oracle есть расширение и, возможно, другие.

Каков контекст?

Если вы создаете HTML-форму для обновления, сгенерируйте данные с помощью цикла for и поместите идентификаторы в таблицу для простого обновления после отправки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...