SQL Group By with limit and distinct - MySQL

时间:2011-05-17 03:34:36

标签: mysql sql

这是我的表格和结构

Shoutbox

  • SID // PK
  • 标题//标题

shoutbox_follower

  • SID
  • UID //用户ID

呐喊

  • SID
  • 文字//呐喊

我想为每个用户关注的Shoutbox获取最后一个(最新)的喊叫(Shouts.Text)


我尝试了这个,但它没有用

select shoutbox_follower.SID,shoutbox.title, shouts.text from shoutbox_follower, shoutbox, shouts where shoutbox_follower.uid=1;

但我可以用多个查询来完成工作

SELECT SID from shoutBox_Follower where UID=5
SELECT SID,TEXT from Shouts where SID in ($boxList) order by id desc limit 1
SELECT Title from Shoutbox where SID=? limit 1

2 个答案:

答案 0 :(得分:4)

您可以组合查询,例如:

SELECT SID,
       (select TEXT
       from Shouts
       where Shouts.SID = shoutBox_Follower.SID
       order by Shouts.SID desc limit 1
       ) as shout_text
from shoutBox_Follower
where UID=5

对于少量行,它执行速度非常快(假设您拥有所需的索引)。根据您的第三个查询,可以使用简单的内部联接来获取标题。

答案 1 :(得分:1)

在评论中,您提到需要快速解决方案。如果是 - 那么将字段latest_shout_id添加到shoutbox表,并使用AFTER INSERTshouts触发器维护它。就是这样。

以下是您可以执行所需操作的查询(假设您在shout_id表中将shouts作为PK,并在shoutbox字段中引用shoutbox_id:< / p>

    SELECT x.*
      FROM shoutbox_follower f
INNER JOIN (SELECT MAX(shout_id) shout_id,
                   shoutbox_id
              FROM Shouts s
          GROUP BY shoutbox_id) x ON x.shoutbox_id = f.sid 
     WHERE f.uid = 5

将其更改为相关子查询可能会以更快或更慢的方式更改它,这取决于很多因素。