2016-02-26 149 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。 我想要做的是从每个论坛获取最新帖子(时间戳的最高值),但我有点卡在这里。 它看起来如何在当前状态下的画面: 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

这只显示论坛的最新帖子,因为它只选择具有时间戳最大值的行。也就是说它不显示'测试'论坛:http://i.imgur.com/etS0wN3.png – PindaPixel

+0

这可能是由于测试后人为地生成没有适当的用户,甚至可能是论坛。请尝试自行运行子查询。您会注意到它会为每个FID/TID生成最大时间戳。请验证数据完整性。 –

+0

您也可以尝试用'LEFT'' JOIN用户'替换'INNER'来进行测试。 –