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

SQL zwraca 100 losowych wierszy dla każdego wieku

Możesz użyć zmiennych zdefiniowanych przez użytkownika, poniżej zapytanie da ci jeden rekord na każdy odrębny wiek, wewnętrzne zapytanie po prostu sprawdza dla tych samych grup wiekowych i nadaje im rangę jak dla 4 tych samych grup wiekowych (wiek =1) ranga wyniesie 1,2,3 ,4 i gdy wiek =2, numer rangi zacznie się ponownie od 1, a filtr zewnętrznego zapytania filtruje wiersze, aby pokazać, gdzie pozycja wynosi 1, więc dla każdego odrębnego wieku otrzymasz jeden wiersz i są one uporządkowane losowo

SELECT  c.name, c.Gender, c.Age, c.MP, c.score
FROM (
SELECT i.name, i.Gender, i.Age, i.MP, b.score,
@r:= CASE WHEN @g = i.Age THEN @r + 1 ELSE 1 END rownum,
@g:=i.Age
FROM i
INNER JOIN b ON b.name=i.name
CROSS JOIN(SELECT @g:=NULL ,@r:=0) a
WHERE i.MP='F' AND i.gender='F' AND b.score<=-1
ORDER BY  i.Age, RAND()
) c
WHERE c.rownum = 1
ORDER BY c.Age
LIMIT 100

załóżmy, że połączone zapytanie daje wyniki w postaci

Przykładowy zestaw danych

name   gender  Age  Mp score
============================
test1  male    1    1   10
test2  male    1    1   10
test3  male    1    1   10
test4  male    2    1   10
test5  male    2    1   10
test6  male    3    1   10
test7  male    4    1   10
test8  male    4    1   10
.....

Teraz użycie wewnętrznego zapytania w mojej odpowiedzi da ci zestawy wyników z kolumną rang jak poniżej

Zestaw wyników zapytania wewnętrznego

name   gender  Age  Mp score rank
==================================
test2  male    1    1   10    1
test1  male    1    1   10    2
test3  male    1    1   10    3
test4  male    2    1   10    1
test5  male    2    1   10    2
test6  male    3    1   10    1
test7  male    4    1   10    1
test8  male    4    1   10    2

Jak w powyższym zestawie wyników widać, że wiek =1 ma 3 wiersze i ich rangi są różne 1,2,3 ten sam przykład dla wieku =2 rangi to 1,2 takie same dla wieku =4, teraz w mojej odpowiedzi zewnętrzne zapytanie będzie odfiltruj wynik, gdzie pozycja =1, więc ostateczny zestaw wyników będzie zawierał po jednym wierszu dla każdego odrębnego, jak patrz poniżej zestaw wyników

Końcowe wyjście

name   gender  Age  Mp score rank
==================================
test2  male    1    1   10    1
test4  male    2    1   10    1
test6  male    3    1   10    1
test7  male    4    1   10    1

Losowa część zamówienia jest wykonywana na wewnętrznym zapytaniu, ponieważ możesz zobaczyć kolejność według części ORDER BY i.Age, RAND() najpierw uporządkuje wiek w kolejności rosnącej, a następnie dla tych samych wartości wieku uporządkuje wyniki losowo. Mam nadzieję, że to ma sens



  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 mogę uzyskać pełną listę wszystkich zapytań aktualnie uruchomionych na moim serwerze MySQL?

  2. Obliczanie średniej ruchomej MySQL?

  3. Jak wywołać echo instrukcji print podczas wykonywania skryptu sql?

  4. Dynamiczny kursor w procedurze składowanej

  5. Klauzula równoważna MySQL ONLY IN()