2017-05-27 83 views
1

我試圖創建一個排行榜,但我不知道如何執行mysql查詢。MYSQL PHP查詢中的多次計數

我想計算技能表中玩家的所有等級,並獲得總體等級並計算體驗表中玩家的所有經驗並獲得總體經驗值,並顯示用戶的人名柱。

有3個表factions_mcmmo_users,factions_mcmmo_experience,factions_mcmmo_skills。

這是我迄今爲止,但它不工作:

$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;"); 

任何幫助將是非常讚賞

編輯:我現在的工作,但我不能確定它是最有效的做事方式,所以如果任何人都可以幫助我,如果有更好的方法,這將意味着很多。

我也想知道是否有可能用逗號顯示總exp和水平,如果數字是在數千例如:總水平5882和總XP 582882

編輯2: 我想通了如何格式化數字,但仍然不知道如果我的代碼是有效的

$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;"); 

編輯3從scaisEdge 更新的代碼,但在每個人顯示爲1和XP的水平1,所以我改變了計數(*)改爲總和,按順序添加了TotalLevel,並且這似乎奏效了,但我無法讓它顯示用戶表中的用戶名(用戶列)?不知道我是否應該改變總和,因爲它不以另一種方式工作。

$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 一切工作,但是當我嘗試使用「FORMAT格式化總數(總和(列),0)在內部連接時,EXP總似乎工作,但主要總級別不顯示超過1,000的結果,並且它打破了排行榜定位,它應該按照總級對它們進行排序,但它看起來是隨機的,當您刪除格式時,它會返回到工作狀態

我希望它顯示逗號,如果數數是幾千例如:總等級:5532和總EXP 5882,882

見現場演示:http://mcbuffalo.com/playground/leaderboards/server/factions-mcmmo.php

更新的代碼試圖利用格式:

$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 用PHP更改號碼,一切正常

原始圖片 Users table

Experience Table

Skills Table

回答

1

$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

我得到的錯誤「SQLSTATE [42000]你可以使用幾個內部聯接:語法錯誤或訪問衝突:1064您有一個錯誤在你的SQL語法中;檢查與您的MySQL服務器版本相對應的手冊,以便在第1行的'FROM factions_mcmmo_users a INNER JOIN factions_mcmmo_experience b WHERE b.us'處使用正確的語法「 –

+0

answer updated .. – scaisEdge

+0

這似乎是計算表格?我似乎已經解決了它,並在頂端文章中修改了它,你能否告訴我是否有更好的方法來做到這一點,或者如果這種方式沒有問題的話, –