Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SQL-Abfrage - Begrenzung der Abfrageergebnisse

Wenn Sie zwei Benutzervariablen verwenden und dieselbe aufeinanderfolgende store_id zählen, können Sie <= 5 ersetzen mit jedem gewünschten Limit

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

Ändern Sie wie gewünscht eine Erklärung:

Die erste Unterabfrage (a) ist diejenige, die die Daten gruppiert und ordnet, sodass Sie Daten wie die folgenden haben:

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

die zweite Unterabfrage (b) initialisiert die Benutzervariable @prev mit -1 und @count mit 1

dann wählen wir alle Daten aus der Unterabfrage (a) und verifizieren die Bedingung im case .

  • vergewissern Sie sich, dass die vorherige store_id (@prev ), die wir gesehen haben, unterscheidet sich von der aktuellen store_id.Seit dem ersten @prev gleich -1 ist, gibt es nichts, was mit der aktuellen store_id übereinstimmt, also die Bedingung <> wahr ist, geben wir dann den zweiten Fall ein, der gerade dazu dient, den Wert @prev zu ändern mit der aktuellen store_id. Dies ist der Trick, damit ich die beiden Benutzervariablen @count ändern kann und @prev im gleichen Zustand.

  • wenn die vorherige store_id gleich @prev ist Erhöhen Sie einfach den @count Variable.

  • Wir überprüfen, ob die Anzahl innerhalb des gewünschten Werts liegt, also <= 5

Also mit unseren Testdaten die:

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