Bạn có thể sử dụng các biến do người dùng xác định bên dưới truy vấn sẽ cung cấp cho bạn một bản ghi cho mỗi độ tuổi riêng biệt, truy vấn bên trong chỉ là kiểm tra các độ tuổi giống nhau và xếp hạng cho chúng như cho 4 độ tuổi giống nhau (tuổi =1) xếp hạng sẽ là 1,2,3 , 4 và khi age =2 thì số thứ hạng sẽ bắt đầu lại từ 1 và trong đó bộ lọc truy vấn bên ngoài đang lọc các hàng để hiển thị thứ hạng là 1, do đó, đối với mỗi độ tuổi riêng biệt, bạn sẽ nhận được một hàng và chúng được sắp xếp ngẫu nhiên
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
giả sử truy vấn đã tham gia của bạn cung cấp cho bạn kết quả là
Tập dữ liệu mẫu
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
.....
Bây giờ sử dụng truy vấn bên trong trong câu trả lời của tôi sẽ cung cấp cho bạn các tập hợp kết quả với cột xếp hạng như bên dưới
Bộ kết quả truy vấn bên trong
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
Như trong tập kết quả ở trên, bạn có thể thấy đối với age =1 có 3 hàng và thứ hạng của chúng khác nhau 1,2,3 cùng một ví dụ cho age =2 thứ hạng là 1,2 giống nhau đối với age =4, Bây giờ trong câu trả lời của tôi, truy vấn bên ngoài sẽ lọc ra kết quả trong đó rank =1 để tập hợp kết quả cuối cùng sẽ chứa một hàng cho mỗi điểm riêng biệt như xem tập hợp kết quả bên dưới
Kết quả cuối cùng
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
Phần đặt hàng ngẫu nhiên được thực hiện ở truy vấn bên trong vì bạn có thể xem đơn hàng theo từng phần ORDER BY i.Age, RAND()
đầu tiên nó sẽ sắp xếp thứ tự độ tuổi theo cách tăng dần và sau đó đối với các giá trị độ tuổi tương tự, nó sẽ tiếp tục sắp xếp các kết quả một cách ngẫu nhiên.