Top 10 koleksiyon tamamlama - in-sorgu MySQL formül bir canavar?

1 Cevap php

Ben aşağıdaki tabloları var:

User Basic Data (unique)
[userid] [name] [etc]

User Collection (one to one)
[userid] [game]

User Recorded Plays (many to many)
[userid] [game] [scenario] [etc]

Game Basic Data (unique)
[game] [total_scenarios]

Ben çıktı% azalan Top 10 kullanıcılar için toplama play tamamlanma yüzdesini gösteren bir tablo istiyorum:

Çıktı Tablosu

[userid]  [collection_completion]
   3               95%
   1               81%
  24               68%
  etc              etc

Aklımda, bir kullanıcı için hesaplama sırası:

  1. dan kapmak kullanıcının toplam sahip senaryoları User Collection Game Basic Data ve COUNT(gbd.total_scenarios) ile katıldı
  2. Bu kullanıcı için COUNT(DISTINCT scenario) tarafından kaydedilen tüm oyunlar kapmak
  3. Toplam sahip senaryoları tarafından kaydedilen tüm oyunlarını bölmek

Böylece sonunda 2 sorgular ve biraz PHP masaj bulunuyor. Tamamlanma yüzdesi sıralama kriteri kullanıcıların listesi için işler biraz daha karışık.

Ben all users' collection totals Bir sorguda kapmak, ve all users recorded plays başka, ve sonra CALCS yapmak ve PHP son dizi sıralamak anlamaya, ama potansiyel olarak tüm yapıyor overkill gibi görünüyor 1000 + kullanıcıları için sadece hiç Top 10 istediğinizde söyledi.

Tüm bu ve LIMIT 10 yapabileceği MySQL kötü bir canavar sorgu var mı? Veya işin toplu bu durumda gitmek için yol işleme PHP ile taşıyorsa?

1 Cevap

Ben doğru ne gerek anlamak, gibi bir şey deneyebilirsiniz

SELECT  userid,
        us.TotalUserscenario / gbd.total_scenarios collection_completion
FROM    (
            SELECT  userid,
                    game,
                    COUNT(scenario) TotalUserscenario
            FROM    UserRecordedPlays urp
            GROUP BY    userid,
                        game
        ) UserScenarios us INNER JOIN
        GameBasicData gbd ON us.game = gbd.game
ORDER BY collection_completion DESC
LIMIT 10