2013-09-09 3 views
0

Скажут, у меня есть следующий MySQL таблица:Получить ребенок комментарии

Table Comment: 
    id int not null, 
    parent_id int not null, 
    body text not null, 
    created datetime not null 

parent_id является рекурсивным отношением. Не обращайте внимания на то, является ли оно нулевым или нет, поскольку я всегда могу назначить фиктивный идентификатор, если нет родителя.

Я хочу выбрать дочерние комментарии для каждого родителя (последние 5 для каждого родителя).

Если я использую что-то вроде

SELECT * FROM Comment WHERE parent_id in (...) ORDER BY created DESC 

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

Я хочу выбрать родителей, а также детей первой степени (не более 5) в одном запросе или наиболее эффективным способом.

Любая идея?

+0

есть таблица 'parent'? – jaczes

+0

Это рекурсивные отношения. – Lucas

ответ

0

parent_id not null ?? И если я хочу опубликовать новый комментарий, который на самом деле станет его родительским комментарием? Этот атрибут будет 0 или что?

Я думаю, я не зондировать предложение:

select * from comment as c where c.id=NUMBER and c.parent_id in (Select id from comment as c2 where c.parent_id = c2.id) 
0
SELECT p.* 
FROM Comment AS p 
WHERE id IN (...)       -- list of parent IDs 

UNION ALL 

SELECT 
    c.* 
FROM 
    (SELECT id AS parent_id 
     FROM Comment 
     WHERE id IN (...)     -- list of parent IDs 
    ) AS d 
    JOIN 
    Comment AS c 
     ON c.parent_id = d.parent_id 
     AND c.created >= COALESCE(
      (SELECT ci.created 
      FROM Comment AS ci 
      WHERE ci.parent_id = d.parent_id 
      ORDER BY ci.created DESC 
      LIMIT 1 OFFSET 4 
     ), '1000-01-01') 

ORDER BY 
    COALESCE(parent_id, id), 
    c.created ; 

Индекс по (parent_id, created) поможет эффективности.

+0

не так короче? выбрать с. * От комментариев с где c.created> = COALESCE ( (выберите созданные из комментариев где parent_id = c.parent_id заказа по созданному по алфавиту), '2000-01-01') и с. parent_id в (..) – Lucas

+0

также, разве MySQL не должен был бы вычислить кусок coalesce для каждого комментария, который он встречает, который соответствует parent_id? – Lucas

+0

Функция 'COALESCE()' заменяет NULL для случаев, когда родительский комментарий имеет менее 5 подкомпонентов. Он будет применяться столько раз, сколько количество родительских идентификаторов в вашем списке. –