Нужна помощь с подзапросом / группой / заказом (получите последний комментарий по каждой заказанной теме) - PullRequest
1 голос
/ 22 апреля 2010

Привет, ребята, у меня есть запрос, который в настоящее время находит последний комментарий для каждой из тем пользователя, а затем упорядочивает темы по метке времени этого комментария. То, что я хочу сделать, это расширить использование этого запроса и напечатать последний комментарий для каждой темы. Проблема с этим запросом состоит в том, что, хотя он упорядочивает темы правильно, он печатает кажущиеся случайными комментарии для каждой темы. Я пытаюсь реализовать подзапрос, но я не совсем уверен, как подойти к нему. Я думал, что мне просто нужно как-то использовать этот запрос, чтобы получить комментарии. Если у кого-то есть идеи, я был бы очень признателен.

Вот что мне нужно добавить

SELECT * FROM comments where topic_id='$topic_id' ORDER BY timestamp DESC LIMIT 1

Вот запрос, который мне нужно изменить

SELECT topic.topic_title, topic.content_type, topic.subject_id, topic.creator, topic.description, topic.topic_id,comments.message,comments.user
      FROM comments
      JOIN topic ON topic.topic_id = comments.topic_id
      WHERE topic.creator = '$user' AND comments.timestamp > $week
      GROUP BY topic_id ORDER BY MAX(comments.timestamp) DESC

Ответы [ 3 ]

2 голосов
/ 22 апреля 2010

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

SELECT t.topic_title, t.content_type, t.subject_id, t.creator, t.description, 
  t.topic_id, c1.message, c1.user
FROM topic t
JOIN comments c1 ON (t.topic_id = c1.topic_id)
LEFT OUTER JOIN comments c2
  ON (t.topic_id = c2.topic_id AND c1.timestamp < c2.timestamp)
WHERE t.creator = ? AND c1.timestamp > ?
  AND c2.topic_id IS NULL
ORDER BY c1.timestamp DESC;

PS: используйте параметры запроса (?) для динамических значений, чтобы уменьшить риск внедрения SQL.

0 голосов
/ 22 апреля 2010
select t.topic_title, t.content_type, t.subject_id, t.creator, t.description, t.topic_id, c.message, c.user
from comments c
inner join (
    SELECT cc.topic_id, max(cc.timestamp) as MaxTimestamp
    FROM comments cc
    inner JOIN topic t ON t.topic_id = cc.topic_id
    WHERE t.creator = '$user' AND cc.timestamp > $week      
    group by cc.topic_id
) cm on c.topic_id = cm.topic_id and c.timestamp = cm.MaxTimestamp
inner JOIN topic t ON t.topic_id = c.topic_id
0 голосов
/ 22 апреля 2010

Не уверен, что делает ваша переменная $ week, но я надеюсь, что она отформатирована.

Как насчет этого?Я подозреваю, что это будет медленно, но это первое, что пришло в голову:

SELECT t.topic_title, t.content_type, t.subject_id, t.creator,
   t.description, t.topic_id, c.message, c.user
FROM topic t
INNER JOIN comments c
  ON t.topic_id = c.topic_id
  AND c.comment_id = (select max(c2.comment_id) 
                    from comments c2
                    where c2.topic_id = topic.topic_id)
WHERE t.creator = '$user' 
  AND c.timestamp > $week
...