الخلية - تحسين استعلام والبحث رتبة على أساس عمود مبلغ
-
03-07-2019 - |
سؤال
ولدي قاعدة بيانات درجة عالية لعبة التي تتعقب كل لعبة في مجموعة متنوعة من العالم. ما أريد القيام به هو معرفة بعض الإحصاءات عن المسرحيات، ومن ثم تجد فيها كل العالم "صفوف" وفقا لكل العالم الآخر (مرتبة حسب عدد المرات التي لعبت).
وحتى الآن أنا عندي كل ما عندي من الإحصاءات على ما يرام، ولكن لقد واجهت مشكلة في إيجاد ترتيب كل العالم.
وأنا أيضا متأكد من القيام بذلك في ثلاثة استعلامات منفصلة من المحتمل ان يكون بطريقة بطيئة جدا للذهاب نحو ذلك، وربما يمكن تحسينها.
ولدي عمود الطابع الزمني (لا تستخدم هنا) وعمود "العالم" المفهرسة في مخطط DB. وفيما يلي مجموعة مختارة من مصدر بلدي:
function getStast($worldName) {
// ## First find the number of wins and some other data:
$query = "SELECT COUNT(*) AS total,
AVG(score) AS avgScore,
SUM(score) AS totalScore
FROM highscores
WHERE world = '$worldName'
AND victory = 1";
$win = $row['total'];
// ## Then find the number of losses:
$query = "SELECT COUNT(*) AS total
FROM highscores
WHERE world = '$worldName'
AND victory = 0";
$loss = $row['total'];
$total = $win + $loss;
// ## Then find the rank (this is the broken bit):
$query="SELECT world, count(*) AS total
FROM highscores
WHERE total > $total
GROUP BY world
ORDER BY total DESC";
$rank = $row['total']+1;
// ## ... Then output things.
}
وأعتقد أن خط معين من التعليمات البرمجية التي هو الفشل لي هو في الاستعلام RANK،
WHERE total > $total
هل لا يعمل لأنه لا يمكن أن تقبل ما مجموعه المحسوب كحجة في جملة WHERE؟
وأخيرا، هل هناك طريقة أكثر كفاءة لحساب كل هذا في استعلام SQL واحد؟
المحلول
وأعتقد أنك قد ترغب في استخدام "وجود الإجمالي> $ مجموعه؟
SELECT world, count(*) AS total
FROM highscores
GROUP BY world
having total > $total
ORDER BY total DESC