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 A10枚の写真がuser B好きで、8枚の写真が好きでuser C、2枚の写真が好きだとすると、から最​​後の5つ、からuser Aの最後の5つ、からuser Bの最後の2つだけが必要ですuser C。それが理にかなっている場合、これはどのように行うことができますか?

4

2 に答える 2

1

あなたが持っているクエリは良いですが、私はそれをラップし、MySQL変数を使用して各戻り変数をチェックし、各「liker」ごとのシーケンスを増やしています。Likerが変更されたら、シーケンスを1に戻します。...次に、シーケンスにHAVING<6を適用します。@likeSeqと@lastLikerを更新し続けるすべてのレコードをQUALIFIEDにする必要があるため、WHERE句でこれを行うことはできません。それが行われた後だけ、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 に答える