Нужна помощь с MySQL SELECT (внутригрупповой агрегат) - PullRequest
0 голосов
/ 19 марта 2011

Фон

У меня есть таблица комментариев.Каждый комментарий относится к определенной строке в таблице «лид» или «продукт».Для каждой строки в таблицах «лидер» и «продукт» может быть несколько комментариев.Также может быть несколько комментариев с одним и тем же kstatus для каждой строки.

comments
    INT id /* primary key */
    ENUM('lead', 'prod') type /* tells me whether the comment belongs to a row in the lead table or the prod table */
    INT fid /* foreign key, refers to the id column in either the lead or prod table */
    MEDIUMTEXT comment  /* the comment itself */
    INT timestamp /* when the comment was written, i.e. 1300530201 */
    INT kstatus /* foreign key, refers to the id column in the kstatus column */

lead
    INT id
    ...

prod
    INT id
    ...

kstatus
    INT id
    ...

Комментарий с type = 'lead' и fid = 105 относится к строке в лидере с lead.id = 105.Комментарий с type = 'prod' и fid = 105 относится к строке в prod с prod.id = 105.

Вопрос

Я хочу ВЫБРАТЬ первый предоставленный комментарий (если таковые имеются и основаны на отметке времени) для каждой строки в таблице 'lead' с определенным kstatus (скажем, 14).

Вот моя попытка, которая возвращает слишком мало результатов.Может быть, из-за смешивания fid ссылается на lead.id и fid ссылается на prod.id?

SELECT C1.*
FROM comments AS C1
LEFT JOIN comments AS C2 ON (C1.timestamp > C2.timestamp AND C1.fid = C2.fid)
WHERE C2.timestamp is NULL
AND C1.type = 'lead'
AND C1.kstatus = 14
GROUP BY C1.fid

Ответы [ 2 ]

0 голосов
/ 19 марта 2011

Вы теряете результаты не только из-за смешения между продуктами и лидами, но и между значениями kstatus - ваше левое объединение находит все строки в C2 с более ранней отметкой времени, независимо от типа и kstatus, еслиfid - это то же самое.

Одним из решений будет добавление AND C1.type = C2.type AND C1.kstatus = C2.kstatus к условию соединения.

0 голосов
/ 19 марта 2011
select c2.*
from (
    select min(c.id) realfirstcomment
    from (
        select fid, min(timestamp) as firstcomment
        from comments
        where type='lead' and kstatus=14
        group by fid
    ) f, comments c
    where f.fid = c.fid
      and c.type='lead' and c.kstatus=14
      and f.firstcomment = c.timestamp
    group by c.fid
) f2, c2
where f2.realfirstcomment = c2.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...