Mysql
 sql >> база данни >  >> RDS >> Mysql

Sql заявка - ограничаване на резултатите от заявката

Използвайки две потребителски променливи и отчитайки един и същ последователен store_id, можете да замените <= 5 с какъвто лимит искате

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

Редактирайте, както е поискано някакво обяснение:

Първата подзаявка (a) е тази, която групира и подрежда данните, така че ще имате данни като:

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

втората подзаявка (b) инициира потребителската променлива @prev с -1 и @count с 1

след това избираме всички данни от подзаявката (a), проверявайки условието в case .

  • проверете дали предишният store_id (@prev ), който видяхме, е различен от текущия store_id. От първия @prev е равно на -1, няма нищо, което да съответства на текущия store_id, така че условието <> е вярно, ние въвеждаме, тогава е вторият случай, който просто служи за промяна на стойността @prev с текущия store_id. Това е трикът, за да мога да променя двете потребителски променливи @count и @prev в същото състояние.

  • ако предишният store_id е равен на @prev просто увеличете @count променлива.

  • проверяваме дали броят е в рамките на желаната от нас стойност, така че <= 5

Така че с нашите тестови данни:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Не можете да заредите часови зони?

  2. MySQL най-добрият начин за съхранение на дълги низове

  3. MySQL:индексни json масиви с променлива дължина?

  4. Как да кодирам (utf8mb4) в Python

  5. Допълване на началото на поле на mysql INT с нули