2013-02-18 3 views
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. Если это имеет смысл, как это можно сделать?

ответ

1

Запрос у вас есть хороший, но я оборачивать, что и с помощью переменного MySQL для проверки каждого возврата переменными и увеличить последовательность на каждый «Liker». Когда пользователь изменится, установите последовательность обратно в 1 .... Затем примените для последовательности последовательность символов: <. Вы не можете сделать это в предложении 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 
+0

я снял с запятой в строке 4, и я получаю результаты обратно, но я я не получаю все строки. первый возвращает 3 строки, когда он должен возвращать 5 строк, а второй возвращает 2 строки, которые являются правильными. –

+0

@RyanNaddy, удалите часть запроса «HAVING» и посмотрите ВСЕ, что он вернется обратно ... Ваш уже самый внутренний запрос уже имел данные на основе LIKER ID FIRST, а затем спускает дату. Итак, если есть что-то неправильное , посмотрите на необработанные данные и проверьте их значения на «Seq» и ​​последнем значении «Liker» в каждой строке, чтобы убедиться, что они имеют смысл ... – DRapp

+0

Без наличия я получаю все данные. добавив его, он удаляет Seq '2' и' 4' от первого пользователя, но затем изменяет '2' на' 3' для второго пользователя. Я получу несколько скриншотов –

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 ... 
+0

Я получаю сообщение об ошибке после p2 перед тем, где –

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