2016-03-21 23 views
1

Kendim çözemediğim bir problem buldum.Farklı tablolardan kullanıcı puanları

AE_Users tablosundaki kullanıcılara özel Puanlarını sakladığım yer AE_Users Ek AE_Event tablosuna sahibim, kullanıcıların katılabileceği etkinlikleri depolarım ve bu etkinlikler için saniyeler içinde (zaman damgası) oynatma süresini saklıyorum CRON script'in sunucudaki oyuncularını kontrol etmesi. AE_EventJoin adlı kullanıcının, olaylardan birine katıldığında saklandığı başka bir tablo var (bu nedenle birden çok olay kimliğine katılan bir kullanıcının birden çok kaydı olabilir)

3 SQL kullanarak bir kullanıcının puan sayısını hesaplayabiliyorum PHP komut:

SELECT `SteamID` FROM AE_Users WHERE `SteamID` = $SteamID 
SELECT SUM(`EventInfo`) FROM AE_Events WHERE ID IN (SELECT `EventID` FROM AE_EventJoin WHERE `JoinType` = 1 AND `SteamID` = '$SteamID') 
SELECT `Points` FROM AE_Users WHERE `SteamID` = $SteamID 

ama şimdi en yüksek puana sahip 5 kullanıcıları üst almak gerekir ve gerçekten onları bana DB sorgulamak için nasıl çözememiştir.

DB'yi tüm kullanıcılar için sorgulamak istemiyorum ve sonra bunları PHP'ye göre sıralamak çok çirkindir.

Kullanıcı noktalarını tek bir SQL sorgusundan nasıl hesaplayacağımızın bir yolu olduğuna inanıyorum. Kendim inşa etmeye çalıştım ama beklendiği gibi çalışmıyor. Ben böyle bir cevap başardı: phpMyAdmin result

ve bu yanlıştır:

SELECT T1.`SteamID`, T1.`Points` AS PointCount, SUM(T2.`EventInfo`) AS PointCount FROM AE_Users T1, AE_Events T2 WHERE T2.ID IN (SELECT `EventID` FROM AE_EventJoin WHERE `JoinType` = 1 AND `SteamID` = T1.`SteamID`) ORDER BY PointCount LIMIT 5 

bu döner. Sadece bir kullanıcı döndürür ve ilk PointCount kullanıcının özel nokta sayısıdır, ancak doğru olan ikinci PointCount tamamen yanlıştır. resim phpMyAdmin Event points

Ve bu iki değişkeni bir PointCount'a birleştirmek istiyorum, ancak GROUP BY komutu bazı hatalar yüzünden yapmama izin vermedi. Ancak büyük bir sorun değil, onları kolayca PHP'de birleştirebilirim.

Tabii ki, sahip olduğum yapıya sahip tablolardan ihtiyacım olan bilgiyi nasıl elde edebileceğimin bir yolu var mı?

cevap

0

Sen fıkra ile bir grup eksik, bu yüzden denemek bu edilmektedir: (virgülle ayrılmış) sözdizimi katılmak

SELECT T1.`SteamID`, max(T1.`Points`) AS PointCount, SUM(T2.`EventInfo`) AS PointCount 
FROM AE_Users T1 
INNER JOIN AE_Events T2 
ON T2.ID IN (SELECT `EventID` FROM AE_EventJoin 
       WHERE `JoinType` = 1 
       AND `SteamID` = T1.`SteamID`) 
GROUP BY T1.`SteamID` 
ORDER BY PointCount 
LIMIT 5 

Ayrıca, örtülü kullanılan bu kaçınıyorum ve açık olduğu gibi katılır doğru sözdizimi kullanın çözümüm.

Tablo yapılarınızı göndermediniz, bu nedenle tam olarak neye ihtiyacınız olduğunu tahmin etmek zordu, ancak buna benzer bir şey.

Bu sorgu

ayrıca katılmak yerine IN()

SELECT T1.`SteamID`, max(T1.`Points`) AS PointCount, SUM(T2.`EventInfo`) AS PointCount 
FROM AE_Users T1 
INNER JOIN `EventID` T3 
ON(t1.`steamID` = t3.`steamID` and `JoinType` = 1 AND `SteamID` = T1.`SteamID`) 
INNER JOIN AE_Events T2 
ON (T2.ID = T3.ID) 
GROUP BY T1.`SteamID` 
ORDER BY PointCount 
LIMIT 5 
+0

teşekkür ile yazılabilir, senin (ilk kod) çözümü son derece yararlı oldu. SUM (T2.'EventInfo') + T1.'Points' olarak ikinci PointCount'ı hesaplamak için biraz değiştirdim ve DESC için siparişi değiştirdim ve beklendiği gibi çalışıyor. Çok teşekkür ederim :) – ffredyk

İlgili konular