sql >> Database >  >> RDS >> Mysql

Sql Query - Queryresultaten beperken

Door twee gebruikersvariabelen te gebruiken en dezelfde opeenvolgende store_id te tellen, kunt u <= 5 . vervangen met welke limiet je maar wilt

SELECT a.*
FROM (
 SELECT store_id, user_id, count(1) as visits 
 FROM shopping
 WHERE store_id IN (60,61,62,63,64,65,66)
 GROUP BY store_id, user_id
 ORDER BY store_id, visits desc, user_id
) a,
(SELECT @prev:=-1, @count:=1) b
WHERE
 CASE WHEN @prev<>a.store_id THEN
   CASE WHEN @prev:=a.store_id THEN
    @count:=1
   END
 ELSE
   @count:[email protected]+1
 END <= 5

Bewerk zoals gevraagd enige uitleg:

De eerste subquery (a) is degene die de gegevens groepeert en ordent, zodat u gegevens krijgt zoals:

store_id | user_id | visits
---------+---------+-------
 60           1       5
 60           2       3
 60           3       1
 61           2       4
 61           3       2

de tweede subquery (b) init de gebruikersvariabele @prev met -1 en @count met 1

dan kiezen we alle gegevens uit de subquery (a) verifiëren van de voorwaarde in de case .

  • controleer of de vorige store_id (@prev ) die we hebben gezien, verschilt van de huidige store_id.Sinds de eerste @prev is gelijk aan -1 er is niets dat overeenkomt met de huidige store_id dus de voorwaarde <> is waar die we invoeren dan is het tweede geval dat alleen dient om de waarde te wijzigen @prev met de huidige store_id. Dit is de truc zodat ik de twee gebruikersvariabelen @count kan wijzigen en @prev in dezelfde staat.

  • als de vorige store_id gelijk is aan @prev verhoog gewoon de @count variabel.

  • we controleren of de telling binnen de gewenste waarde ligt, dus de <= 5

Dus met onze testgegevens de:

step | @prev | @count | store_id | user_id | visits
-----+-------+--------+----------+---------+-------
  0      -1      1    
  1      60      1        60          1        5 
  2      60      2        60          2        3
  3      60      3        60          3        1
  4      61      1        61          2        4
  5      61      2        61          3        2   


  1. Trends in 2020 waar DBA's zich bewust van moeten zijn

  2. Fix "Rekenkundige overloopfout bij het converteren van int naar gegevenstype numeriek" in SQL Server

  3. SQL-injectie in C . voorkomen

  4. De weergave van DateTime in milliseconden?