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

SQL връща 100 произволни реда за всяка възраст

Можете да използвате потребителски дефинирани променливи по-долу, като заявката ще ви даде по един запис за всяка отделна възраст, вътрешната заявка просто проверява за същите възрасти и им дава ранг като за 4 същите възрасти (възраст =1) рангът ще бъде 1,2,3 ,4 и когато възраст =2, тогава номерът на ранга ще започне отново от 1 и където филтърът на външната заявка филтрира редове, за да покаже къде рангът е 1, така че за всяка отделна възраст ще получите един ред и те са подредени на случаен принцип

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

да предположим, че вашата обединена заявка ви дава резултатите като

Примерен набор от данни

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
.....

Сега използването на вътрешната заявка в моя отговор ще ви даде наборите от резултати с колона за ранг, както е по-долу

Набор от резултати от вътрешна заявка

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

Както в горния набор от резултати, можете да видите за възраст =1 има 3 реда и техните рангове са различни 1,2,3 същия пример за възраст =2 ранга са 1,2 еднакви за възраст =4, Сега в моя отговор външната заявка ще филтрирайте резултата, където ранг =1, така че крайният набор от резултати ще съдържа един ред за всеки отделен, както вижте по-долу набор от резултати

Краен изход

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

Частта за произволно подреждане се извършва във вътрешната заявка, тъй като можете да видите реда по част ORDER BY i.Age, RAND() първо ще подреди възрастта във възходящ начин и след това за същата възраст ще подреди резултатите на случаен принцип. Надявам се, че има смисъл



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да направя групово вмъкване в MySQL?

  2. MySQL - Как да разделяте стойности в единични низове с помощта на запетая

  3. Проблем с mysql_insert_id при вмъкване на данни за едновременност

  4. Има ли начин в SQL (MySQL) да се направи кръгова система ORDER BY в определено поле?

  5. Как да се свържа с MySQL база данни в PHP с помощта на разширение mysqli?