Выберите родителей и детей с MySQL - PullRequest
9 голосов
/ 05 июня 2011

Я знаю, что этот вопрос часто возникает, но сегодня я не могу найти ответ, который ищу. У меня есть таблица с этой схемой.

CREATE TABLE `comments` (
    `id` bigint(10) unsigned not null auto_increment,
    `parent_id` bigint(10) unsigned default 0,
    `date_sent` datetime not null,
    `content` text not null,
    PRIMARY KEY(`id`)
) ENGINE=InnoDB;

Я бы хотел выбрать родительские строки и дочерние элементы этих строк. Я не позволяю детям иметь детей, так что это просто один родитель с любым количеством детей.

Мне кажется, я видел, как это было сделано с профсоюзами или внутренними объединениями.

Ответы [ 3 ]

24 голосов
/ 05 июня 2011

Родители - это записи без parent_id.
Дети имеют parent_id равный id комментария родителей.

  SELECT ...
    FROM comments AS parent
         LEFT JOIN comments AS child 
         ON child.parent_id = parent.id
   WHERE parent.parent_id IS NULL
ORDER BY parent.id, child.id;

Обратите внимание, что самостоятельное соединение должно быть внешним соединением, чтобы вы не пропустили родительские комментарии без детей.

3 голосов
/ 05 июня 2011

Вы ищете

SELECT p.id, child.*
FROM comments p
INNER JOIN comments child ON (child.parent_id = p.id)
WHERE ....

UPDATE
Или LEFT JOIN, если вы хотите видеть строки без родителей

2 голосов
/ 25 февраля 2014

Я не говорю точно, я думаю, что вы получаете такую ​​проблему как:

Ordered_Item

ID | Item_Name
1  | Pizza
2  | Stromboli

Ordered_Options

Ordered_Item_ID | Option_Number | Value
        1               43         Pepperoni
        1               44         Extra Cheese
        2               44         Extra Cheese

выход

ID | Item_Name | Option_1 | Option_2
1    Pizza       Pepperoni  Extra Cheese
2    Stromboli     NULL     Extra Cheese

И мои предложения по использованию этого метода решают эту проблему следующим образом:

  1. Самый простой способ - использовать группу GROUP_CONCAT. функция здесь ..
select 
        ordered_item.id as `Id`, 
        ordered_item.Item_Name as `ItemName`,

  GROUP_CONCAT(Ordered_Options.Value) as `Options`

  from ordered_item, ordered_options

  where ordered_item.id=ordered_options.ordered_item_id

  group by ordered_item.id

Что бы вывести:

Id              ItemName       Options
1               Pizza          Pepperoni,Extra Cheese
2               Stromboli      Extra Cheese

Таким образом, вы можете иметь столько вариантов, сколько захотите, без необходимости изменять ваш запрос.

Ах, если вы видите, что ваши результаты обрезаются, вы можете увеличить ограничение размера GROUP_CONCAT следующим образом:

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