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

SQL-forespørgsel - Begrænsning af forespørgselsresultater

Ved at bruge to brugervariabler og tælle det samme fortløbende store_id, kan du erstatte <=5 med hvilken grænse du ønsker

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

Rediger som anmodet om en forklaring :

Den første underforespørgsel (a) er den, der grupperer og bestiller dataene, så du vil have data som:

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

den anden underforespørgsel (b) indsætter brugervariablen @prev med -1 og @count med 1

så vælger vi alle data fra underforespørgslen (a), der bekræfter betingelsen i case .

  • verificer, at det tidligere store_id (@prev ) vi har set er forskellig fra det nuværende store_id.Siden den første @prev er lig med -1 er der intet, der matcher det aktuelle butiks-id, så betingelsen <> er sandt, vi indtaster, så er det andet tilfælde, som bare tjener til at ændre værdien @prev med det aktuelle butiks-id. Dette er tricket, så jeg kan ændre de to brugervariable @count og @prev i samme stand.

  • hvis det forrige store_id er lig med @prev forøg bare @count variabel.

  • vi tjekker, at antallet er inden for den værdi, vi ønsker, så <=5

Så med vores testdata er:

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. Sådan indsætter du et array i en enkelt MySQL Prepared statement m/ PHP og PDO

  2. mysql REGEXP matcher ikke

  3. Skift trin auto_increment felter inkrementere med

  4. Reparer korrupt database postgresql