Mysql
 sql >> Baza danych >  >> RDS >> Mysql

WYBIERZ kilka rekordów dla każdego DISTINCT w jednym zapytaniu

Musisz użyć zmiennych, wykonując dwa różne liczenia na uporządkowanym zapytaniu:jeden na liczbę postów dla każdego użytkownika, a drugi dla użytkowników:

SELECT posts_counts.*
FROM (
  SELECT
    posts.*,
    @post_count:=case when @prec_user_id=user_id then @post_count+1 else 1 end as pc,
    case when @prec_user_id<>user_id then @user_count:[email protected]_count+1 else @user_count end as uc,
    @prec_user_id:=user_id
  FROM
    posts,
    (select @prec_user_id:=0, @user_count:=0, @post_count:=0) counts
  ORDER BY
    posts.user_id ) posts_counts
WHERE pc<5 and uc<4

EDYTUJ: Możesz również rozważyć wypróbowanie tego zapytania:

SELECT * 
FROM `posts` 
WHERE
  `user_id` IN ( SELECT user_id FROM (
     SELECT DISTINCT `user_id` 
     FROM `posts` 
    ORDER BY `user_id` DESC 
    LIMIT 4 ) limit_users
  ) 
LIMIT 5

(to po prostu wybierze 5 postów ze wszystkich postów od każdego wybranego użytkownika, więc to nadal nie jest to, czego potrzebujesz, ale wykorzystuje sztuczkę polegającą na użyciu LIMIT w podzapytaniu)

EDIT2: Następne zapytanie ograniczy 5 postów dla każdego z 20 użytkowników:

select posts_limited.*
from (
  select
    posts.*,
    @row:=if(@last_user=posts.user_id, @row+1, 1) as row,
   @last_user:=posts.user_id
  from
    posts inner join
    (select user_id from
      (select distinct user_id
       from posts
       order by user_id desc
       LIMIT 20) limit_users
    ) limit_users
    on posts.user_id = limit_users.user_id,
    (select @last_user:=0, @row:=0) r
  ) posts_limited
  where row<=5



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sql jdbc getgeneratedkeys zwraca nie znaleziono kolumny, typ kolumny nieznany

  2. Konwertuj znacznik daty i godziny MySql na format daty JavaScript

  3. Zagregowana suma obiektów JSON w MySQL

  4. MySQL wybierz przed po wierszu

  5. Promień wielu punktów szerokości/długości geograficznej