Bir veri tabanından yüksek puan almak için optimal bir sorgu oluşturmak nasıl?

1 Cevap php

Benim oyun için puanları depolamak için MySQL veritabanı kullanıyorum. Tablonun bir çok basitleştirilmiş bir versiyonu olacaktır

(PlayerID - int) (Name - string) (Score - int)

Bana ilgi oyuncu masanın ortasında olduğunu söylüyorlar 10 sonuç bir dizi dönmek bir sorgu oluşturmak istiyorum.

Belki bir örnek daha net yapmak istiyorum.

Ben sadece yüksek puanı elde etmiş, benim adım Steve. Ben yüksek skor tablosuna baktığımızda bana aşağıda 5 puan ve bana yukarıdaki 5 puan görmek istiyorum. Ben üst puanı varsa Açıkçası bana aşağıda 9 puanları göreceksiniz, ve tersine, ben altta isem bana yukarıda 9 puanları göreceksiniz. Puan tablosunda puan binlerce oluşabilir.

Veritabanı özellikle veri setleri sorgulamak için tasarlanmış gibi sonuçlar sonrası işleme miktarını azaltmak istiyorum.

Herkes bunu başarmak için bir sorgu için bir fikir var mı?

Thanks Rich

1 Cevap

Eğer kullanıcı kimliği ve puan varsa (kullanıcı kimliği ve userScore) yapabilirsiniz:

SELECT * FROM Scores 
WHERE PlayerID = userId
OR PlayerID IN (SELECT PlayerID FROM Scores WHERE Score > userScore ORDER BY Score LIMIT 5)
OR PlayerID IN (SELECT PlayerID FROM Scores WHERE Score < userScore ORDER BY Score DESC LIMIT 5)
ORDER BY Score

EDIT: following your comments: First of all, you need to know the rank of the current user. You can know it with such a query as SELECT COUNT(*) FROM Scores WHERE Score > userScore
It gives you a number n
Then you compute two numbers usersUp and usersDown such as usersDown + userUp = 10 and n - userUp>0 and n + usersDown < SELECT COUNT(*) FROM Scores

Sonra yerine IN ve alt sorgular bir UNION kullanabilirsiniz:

SELECT * FROM Scores WHERE PlayerID = userId
UNION
SELECT * FROM Scores WHERE Score > userScore ORDER BY Score LIMIT usersUp
UNION 
(SELECT * FROM Scores WHERE Score < userScore ORDER BY Score LIMIT usersDown)

Eğer mysql sunucu tarafında kalmak istiyorsanız bir saklı yordam tüm bu toplayabilir