1

我有这个查询:

select pl.photo_id, pl.user_id, pl.liker_id, p1.filename user_filename, p2.filename liker_filename 
FROM photo_likes pl 
 left join photos p1 on (pl.photo_id = p1.photo_id) 
 left join photos p2 on (pl.liker_id = p2.user_id and p2.avatar = 1)
where pl.user_id = $id order by pl.liker_id, pl.date_liked desc

它得到了正确的数据,但我想修改它以限制数据。所以,简而言之,这个查询会得到所有喜欢他们照片的人的所有喜欢,它工作得很好,这可以为每个人抓取很多照片。但我想将其限制为每个人只能获得 5 个:

所以,说user A喜欢我的 10 张照片,user B喜欢我的 8 张照片,喜欢我user C的 2 张照片,我只想要来自 的最后 5 个,来自user A的最后 5 个user B和来自 的最后 2 个user C。如果这是有道理的,怎么能做到这一点?

4

2 回答 2

1

您的查询很好,但我将其包装起来并使用 MySQL 变量检查每个返回变量并增加每个“liker”的序列。当喜欢的人发生变化时,将序列设置回 1.... 然后,对序列应用 HAVING < 6。您不能在 WHERE 子句中执行此操作,因为您希望每条记录都是 QUALIFIED,这会不断更新 @likeSeq 和 @lastLiker。只有在完成之后,HAVING 才会说......之后,如果 seq 大于您的 5 上限,它会将其丢弃。

每个打印屏幕包含的每个备用行...

select
      AllRanks.*
   from 
      ( select
                PreQualified.*,
                @likeSeq := if( PreQualified.Liker_ID = @lastLiker, @likeSeq +1, 1 ) as Seq,
                @lastLiker := PreQualified.Liker_ID
             from
                ( select 
                        pl.photo_id, 
                        pl.user_id, 
                        pl.liker_id, 
                        p1.filename user_filename, 
                        p2.filename liker_filename 
                     FROM 
                        photo_likes pl 
                           left join photos p1 
                              on pl.photo_id = p1.photo_id
                           left join photos p2 
                              on pl.liker_id = p2.user_id 
                             and p2.avatar = 1
                     where 
                        pl.user_id = $id 
                     order by 
                        pl.liker_id, 
                        pl.date_liked desc ) PreQualified,
                ( select @lastLiker := 0,
                         @likeSeq := 0 ) sqlvars
      ) AllRanks
   where
      AllRanks.Seq < 6
于 2013-02-18T03:26:55.393 回答
0

您可以将连接的表包装在子查询中吗?

select ...
from photo_likes
left join photos p1 ...
left join (select p2.filename liker_filename from photos where p1.liker_id = p2.user_id and avatar = 1 LIMIT 5) p2
where ...
于 2013-02-18T03:24:36.840 回答