sql >> Database >  >> RDS >> Mysql

SELECTEER meerdere records voor elke DISTINCT in een enkele query

Je moet variabelen gebruiken, waarbij je twee verschillende tellingen doet op een geordende zoekopdracht:één op het aantal berichten voor elke gebruiker en één voor de gebruikers:

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

BEWERKEN: U kunt ook deze zoekopdracht proberen:

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

(dit selecteert slechts 5 berichten, uit alle berichten van elke geselecteerde gebruiker, dus het is nog steeds niet wat je nodig hebt, maar het gebruikt een truc om een ​​LIMIT te gebruiken in een sub-subquery)

EDIT2: De volgende zoekopdracht beperkt 5 berichten voor elk van de 20 gebruikers:

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. Voeg 0 of 1 in MySQL in op basis van de waarde van het selectievakje

  2. Een overzicht van logische replicatie in PostgreSQL

  3. Hoe Acosh() werkt in PostgreSQL

  4. Yii2 QueryBuilder-update met Join