2016-04-22 16 views
1

それは、リスト、トップ割合が最も高いのを行う必要があります..しかし、私はそれmysqlの降順doesntの仕事は

、ここでコードを実行するときには、ここに絵を https://gyazo.com/ecde864ef09115b8b119eba8a39ecd68をdoesntの。なにが問題ですか?

$sql = "SELECT band, concat(round(sum(punten) *100/
(SELECT sum(punten) FROM bands)) , \"%\") AS percent 
FROM bands 
WHERE punten>0 
GROUP BY band 
ORDER BY percent DESC;"; 
+3

文字列をソートしています!最初に 'percent'を数値に変換します。または、 'concat'を使用せず、ビューレイヤーに'% 'を追加してください。 –

+0

ありがとうございました;) –

答えて

0

あなたパーセント列は、文字列であるので、それらは、(「8」が「2」の後に来るので、例えば、図8に示すように、26よりも大きいものとして扱われる)辞書ソートされます。代わりに、連結の前に数値部分をソートすることができます。これは、現在のクエリを行うことができますが、それはより多くの合計puntenサブクエリにはるかにエレガントに次のようになります。

SELECT  band, CONCAT(ROUND(band_punten) * 100/total_punten), '%') AS percent 
FROM  (SELECT band, SUM(punten) AS band_punten 
      FROM  bands 
      WHERE punten > 0 
      GROUP BY band) a 
CROSS JOIN (SELECT SUM(punten) AS total_punten FROM bands) b 
ORDER BY band_punten DESC 
0

基礎となる値を使用してください。数字を文字列に変換してから数値に戻すのは厄介です。したがって:

SELECT band, 
     concat(round(sum(punten) * 100/sump) , \"%\") AS percent 
FROM bands CROSS JOIN 
    (SELECT sum(punten) as sump FROM bands) x 
WHERE punten > 0 
GROUP BY band 
ORDER BY sum(punten) DESC; 

また、サブクエリをFROM句に移動しました。これはしばしばより効率的です。

関連する問題