2010-04-21 2 views
1

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

Вот что я думаю, что нужно добавить

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 

ответ

2

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

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

работает как шарм Билл, спасибо. Вы даже сделали это без подзапроса, который, как я понимаю, может иметь проблемы с производительностью! Что касается предложения (?), Я понимаю, что они используются в подготовленных заявлениях. Я планирую заменить все мои операторы mysql на подготовленные mysqli заявления, есть ли у вас какие-либо хорошие предложения для ссылок? – Scarface

+1

Я предпочитаю использовать PDO, использование для параметров намного проще, чем mysqli. Это не так сложно, есть хорошие примеры в документах, например. http://php.net/manual/en/pdo.prepare.php –

+0

Еще раз спасибо Билл. – Scarface

0

Не уверен, что делает ваш $ неделю вар, но Я надеюсь, что это формат даты.

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

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 
0
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