2017-05-27 2 views
1

Ich versuche, eine Rangliste zu erstellen, aber ich bin mir nicht sicher, wie die MySQL-Abfrage zu tun.Mehrere Punkte in MYSQL PHP Abfrage

Ich möchte alle Levels von einem Spieler in der Skill-Tabelle zählen und die Gesamtlevel und alle Erfahrungen von einem Spieler in der Erfahrungstabelle zählen und die Total Exp zusammen mit der Anzeige des Personennamens von den Benutzern erhalten Säule.

Es gibt 3 Tabellen factions_mcmmo_users, factions_mcmmo_experience, factions_mcmmo_skills.

Dies ist, was ich bisher, aber es funktioniert nicht:

$sql = ("SELECT a.id, 
(SELECT COUNT(*) FROM factions_mcmmo_experience WHERE user_id = a.id) as TotalXP, 
(SELECT COUNT(*) FROM factions_mcmmo_skills WHERE user_id = a.id) as TotalLevel 
FROM (SELECT DISTINCT id FROM factions_mcmmo_users) a LIMIT 10;"); 

Jede Hilfe sehr geschätzt würde

EDIT: Ich habe es jetzt funktioniert, aber ich bin nicht sicher, ob Es ist der effizienteste Weg, Dinge zu tun. Wenn mir jemand helfen könnte, wenn es einen besseren Weg gäbe, würde das viel bedeuten.

Ich würde auch gerne wissen, ob es möglich ist, die Gesamt exp und Ebene mit Komma angezeigt werden, wenn die Zahl in den Tausenden zum Beispiel: Gesamthöhe 5882 und insgesamt xp 582.882

EDIT 2: I haben herausgefunden, wie die Zahlen zu formatieren, aber immer noch nicht wissen, ob mein Code

$sql = ("SELECT id, user, 
(SELECT FORMAT(Sum(taming)+Sum(mining)+Sum(woodcutting)+Sum(repair)+Sum(unarmed)+Sum(herbalism)+Sum(excavation)+Sum(archery)+Sum(swords)+Sum(axes)+Sum(acrobatics)+Sum(fishing)+Sum(alchemy),0) FROM factions_mcmmo_skills b WHERE b.user_id = a.id) as TotalLevel, 
(SELECT FORMAT(Sum(taming)+Sum(mining)+Sum(woodcutting)+Sum(repair)+Sum(unarmed)+Sum(herbalism)+Sum(excavation)+Sum(archery)+Sum(swords)+Sum(axes)+Sum(acrobatics)+Sum(fishing)+Sum(alchemy),0) FROM factions_mcmmo_experience c WHERE c.user_id = a.id) as TotalXP 
FROM (SELECT id, user FROM factions_mcmmo_users) a group by id ORDER BY TotalLevel DESC, TotalXP DESC LIMIT 10;"); 

EDIT 3 Aktualisiert Code von scaisEdge effizient, sondern wurde jedermanns Niveau 1 und XP Anzeigen als 1, also habe ich count (*) in sum geändert, eine Order By TotalLevel in absteigender Reihenfolge hinzugefügt und das scheint funktioniert zu haben, aber ich kann es nicht bekommen, um den Personennamen (Benutzerspalte) in der Benutzertabelle anzuzeigen? Ich bin mir nicht sicher, ob ich zur Summe wechseln sollte, weil es nicht anders ging.

$sql = ("SELECT a.id, b.TotalXP, c.TotalLevel 
    FROM (SELECT DISTINCT id FROM factions_mcmmo_users) a 
    INNER JOIN (
     SELECT user_id, Sum(taming)+Sum(mining)+Sum(woodcutting)+Sum(repair)+Sum(unarmed)+Sum(herbalism)+Sum(excavation)+Sum(archery)+Sum(swords)+Sum(axes)+Sum(acrobatics)+Sum(fishing)+Sum(alchemy) as TotalXP 
     FROM factions_mcmmo_experience 
     GROUP By user_id 
    ) b on b.user_id = a.id 
    INNER JOIN (
     SELECT user_id, Sum(taming)+Sum(mining)+Sum(woodcutting)+Sum(repair)+Sum(unarmed)+Sum(herbalism)+Sum(excavation)+Sum(archery)+Sum(swords)+Sum(axes)+Sum(acrobatics)+Sum(fishing)+Sum(alchemy) as TotalLevel 
     FROM factions_mcmmo_skills 
     GROUP by user_id 

    ) c on c.user_id = a.id 
    ORDER BY TotalLevel DESC 
    LIMIT 10;"); 

Doesn't display persons name

EDIT 4 Alles funktioniert, aber wenn ich versuche, die Summen zu formatieren „Format (Sum (Spalten), 0) auf der inneren verbindet, erscheint die EXP Insgesamt zu arbeiten, aber Die Haupt-Gesamtstufe zeigt keine Ergebnisse an, die über 1.000 sind, und bricht die Ranglistenpositionierung ab. Sie sollte auf der gesamten Ebene sortiert werden, aber sie scheint zufällig zu sein. Wenn Sie das Format entfernen, wird 0 zurück

Ich möchte, dass es Kommas anzeigt, wenn der Zahl Nummer ist die Tausende zum Beispiel: Gesamt Level: 5532 und Total EXP 5882.882

Siehe Live-Demo: http://mcbuffalo.com/playground/leaderboards/server/factions-mcmmo.php

Aktualisiert-Code versucht Format zu verwenden:

$sql = ("SELECT a.id, a.user, b.TotalXP, c.TotalLevel 
    FROM (SELECT id, user FROM factions_mcmmo_users) a 
    INNER JOIN (
     SELECT user_id, FORMAT(Sum(taming)+Sum(mining)+Sum(woodcutting)+Sum(repair)+Sum(unarmed)+Sum(herbalism)+Sum(excavation)+Sum(archery)+Sum(swords)+Sum(axes)+Sum(acrobatics)+Sum(fishing)+Sum(alchemy), 0) as TotalXP 
     FROM factions_mcmmo_experience 
     GROUP By user_id 
    ) b on b.user_id = a.id 
    INNER JOIN (
     SELECT user_id, FORMAT(Sum(taming)+Sum(mining)+Sum(woodcutting)+Sum(repair)+Sum(unarmed)+Sum(herbalism)+Sum(excavation)+Sum(archery)+Sum(swords)+Sum(axes)+Sum(acrobatics)+Sum(fishing)+Sum(alchemy), 0) as TotalLevel 
     FROM factions_mcmmo_skills 
     GROUP by user_id 

    ) c on c.user_id = a.id 
    ORDER BY TotalLevel DESC;"); 

EDIT 5 Geänderte Nummer mit PHP, alles funktioniert

Originalbilder Users table

Experience Table

Skills Table

Antwort

1

Sie ein paar innere nutzen könnten beitreten

$sql = ("SELECT a.id, a.name, b.TotalXP, c.TotalLevel 
     FROM (SELECT DISTINCT id, name FROM factions_mcmmo_users) a 
     INNER JOIN (
      SELECT user_id, COUNT(*) as TotalXP 
      FROM factions_mcmmo_experience 
      GROUP By user_id 
     ) b on b.user_id = a.id 
     INNER JOIN (
      SELECT user_id, COUNT(*) as TotalLevel 
      FROM factions_mcmmo_skills 
      GROUP by user_id 

     ) c on c.user_id = a.id 
     LIMIT 10 
+0

ich den Fehler „SQLSTATE get [42000]: Syntaxfehler oder Zugriffsverletzung: 1064 Sie haben einen Fehler haben in Ihrer SQL-Syntax; Sie in die Bedienungsanleitung für die richtige Syntax zu Ihrer MySQL-Server-Version entspricht in der Nähe verwenden ‚FROM factions_mcmmo_users ein INNER JOIN factions_mcmmo_experience b auf WHERE b.us‘ at line 1" –

+0

Antwort aktualisiert .. – scaisEdge

+0

Das schien die gesamten Reihen zu zählen in der Tisch? ich habe es schien ausgearbeitet und haben es mit einer Bearbeitung in der oberen Pfosten befestigt ist, könnten Sie mir sagen, ob es einen besseren Weg, es zu tun, oder wenn auf diese Weise in Ordnung ist. –