2016-02-26 6 views
0

Я изо всех сил пытаюсь найти способ получить максимальное значение для каждой строки в моем запросе. Моего запрос выглядит следующим образом:Выберите максимальное значение

SELECT f.FID, f.name, f.description, t.TID, t.topic, p.timestamp, u.username, u.ID 
FROM forum f 
LEFT JOIN threads t ON t.FID=f.FID AND t.TID=(SELECT p.TID FROM posts p WHERE p.timestamp=(SELECT MAX(p.timestamp) FROM posts p)) 
LEFT JOIN posts p ON p.TID=t.TID 
LEFT JOIN users u ON u.ID=p.authorID 

Некоторое простое объяснение: каждый пост связан с TID волоска, в каждом потоке, связанные с FID нужного раздела. Что я хочу сделать, так это получить последнее сообщение (максимальное значение для timestamp) с каждого форума, но я немного застрял здесь. картина того, как она выглядит в текущем состоянии: forum image

+0

http://www.mysqltutorial.org/mysql-subquery/ – C2486

+0

Подробнее о [groupwise max] (http://mysql.rjweb.org/doc.php/groupwise_max). –

ответ

0

Один из способов сделать это с дополнительным присоединиться к производной таблице, содержащей максимальное значение временной метки за TID:

SELECT f.FID, f.name, f.description, t.TID, t.topic, 
     p.timestamp, u.username, u.ID 
FROM forum f 
LEFT JOIN threads t ON t.FID = f.FID 
LEFT JOIN (
    SELECT TID, MAX(timestamp) AS max_timestamp 
    FROM posts 
    GROUP BY TID 
) AS x ON t.TID = x.TIP 
LEFT JOIN posts p ON p.TID = t.TID AND p.timestamp = x.max_timestamp 
LEFT JOIN users u ON u.ID = p.authorID 
0

Первый из все, что я рекомендовал бы использовать внутренний присоединиться. Затем мы можем идентифицировать последнюю почту для каждой темы или форума (см. lp) и использовать ее в качестве фильтра.


Последнее сообщение от каждого Тема:

SELECT 
    f.FID, f.name, f.description, t.TID, t.topic, p.timestamp, u.username, u.ID 
FROM forum f 
INNER JOIN threads t ON t.FID=f.FID 
INNER JOIN posts p ON p.TID=t.TID 
INNER JOIN users u ON u.ID=p.authorID 
INNER JOIN (
    SELECT TID, MAX(timestamp) AS timestamp 
    FROM posts 
    GROUP BY TID 
) lp ON lp.TID = t.TID AND lp.timestamp = p.timestamp 

Последнее сообщение от каждого форума:

SELECT 
    f.FID, f.name, f.description, t.TID, t.topic, p.timestamp, u.username, u.ID 
FROM forum f 
INNER JOIN threads t ON t.FID=f.FID 
INNER JOIN posts p ON p.TID=t.TID 
INNER JOIN users u ON u.ID=p.authorID 
INNER JOIN (
    SELECT ft.FID, MAX(fp.timestamp) AS timestamp 
    FROM posts fp 
    INNER JOIN threads ft ON fp.TID=ft.TID 
    GROUP BY ft.FID 
) lp ON lp.FID = f.FID AND lp.timestamp = p.timestamp 
+0

Это показывает форум с последним сообщением, потому что он выбирает только строки, которые имеют максимальное значение для метки времени. Aka он не показывает форум 'test': http://i.imgur.com/etS0wN3.png – PindaPixel

+0

Это может быть связано с тем, что тестовое сообщение создается искусственно без надлежащего пользователя и, возможно, даже с форума. Попробуйте запустить подзапрос самостоятельно. Вы заметите, что он создает максимальную временную метку для каждого FID/TID. Проверьте целостность данных. –

+0

Вы также можете попробовать заменить 'INNER'' LEFT' 'JOIN users' только для тестирования. –

Смежные вопросы