Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zapytanie SQL — Ograniczanie wyników zapytań

Używając dwóch zmiennych użytkownika i licząc ten sam kolejny identyfikator sklepu, możesz zastąpić <= 5 z dowolnym limitem

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

Edytuj zgodnie z żądaniem pewne wyjaśnienie:

Pierwsze podzapytanie (a) to to, które grupuje i porządkuje dane, dzięki czemu uzyskasz dane takie jak:

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

drugie podzapytanie (b) inicjuje zmienną użytkownika @prev z -1 i @count z 1

następnie wybieramy wszystkie dane z podzapytania (a) weryfikującego warunek w case .

  • sprawdź, czy poprzedni identyfikator sklepu (@prev ) różni się od obecnego identyfikatora sklepu. Od pierwszego @prev jest równe -1, nie ma nic, co pasuje do bieżącego identyfikatora sklepu, więc warunek <> to prawda, wpisujemy to jest drugim przypadkiem, który służy tylko do zmiany wartości @prev z bieżącym identyfikatorem sklepu. To jest sztuczka, dzięki której mogę zmienić dwie zmienne użytkownika @count i @prev w tym samym stanie.

  • jeśli poprzedni identyfikator sklepu jest równy @prev po prostu zwiększ @count zmienna.

  • sprawdzamy, czy liczba mieści się w żądanej wartości, więc <= 5

Tak więc z naszymi danymi testowymi:

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. Jak zatrzymać mysqld

  2. Tabela jest określana dwukrotnie, zarówno jako cel dla 'UPDATE', jak i jako oddzielne źródło danych w mysql

  3. Musisz przekonwertować kolumny na wiersze w MYSQL

  4. Jak wybrać losowo unikatowe pary wierszy z tabeli?

  5. Czy istnieje różnica w używaniu INT(1) vs TINYINT(1) w MySQL?