2010-01-10 4 views
1
N-й

Ситуация:Получение набора всех детей

  • MySQL 5.0
  • 2 таблицы
  • 1-ко-многим родитель-ребенок внешнего ключа (A.ID = B.PARENT_ID)

что необходимо:

  • оператор SELECT запрос, который дает множество всех п-е детей (упорядоченные по их идентификаторам)
  • нужна также форма для использования в UPDATE

Пример:

Таблица 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 B Что я не вижу?

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

+0

Я был бы признателен за голосование больше, чем за предоставление ответа. Мой комментарий наглый, но в отношении предоставленной информации и действительного функционального запроса. И есть пример данных для тех, кто хотел бы проверить. –

ответ

2

Дон прав - 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 = ? для любых детей го уровня вы хотите. ORDER BY в подзапросе важно, чтобы удостовериться, что рейтинг выходит правильно.

Мне непонятно, как вы хотите использовать это для запроса UPDATE - укажите более подробно & Я обновлю, чтобы удовлетворить ваши потребности.

0

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

В чем заключен контекст?

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

Смежные вопросы