sql >> Database teknologi >  >> RDS >> Mysql

VÆLG flere poster for hver DISTINCT én i en enkelt forespørgsel

Du skal bruge variabler og foretage to forskellige tællinger på en ordnet forespørgsel:en på antallet af indlæg for hver bruger og en for brugerne:

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

EDIT: Du kan også overveje at prøve denne forespørgsel:

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
 

(dette vil bare vælge 5 indlæg, ud af alle indlæg fra hver valgt bruger, så det er stadig ikke, hvad du har brug for, men det bruger et trick til at bruge en LIMIT i en under-underforespørgsel)

EDIT2: Næste forespørgsel vil begrænse 5 indlæg for hver af de 20 brugere:

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. SQLite Inner Join

  2. Hvad er omfanget af 'SET foreign_key_checks =0'?

  3. Grundlæggende om tabeludtryk, del 5 - CTE'er, logiske overvejelser

  4. Hurtigste måde at tjekke for eksisterende post, inden du indsætter [mysql_errno()]