2013-06-10 9 views
30

私がしたいのは、SUMですが、加算する行の数はCOUNT、制限は5行までです。だから私のクエリは次のとおりです。私は戻って予想何LIMIT付きMySQLカウント

SELECT COUNT(*), SUM(score) FROM answers WHERE user=1 LIMIT 5 

は、COUNT(*)5まで(私はちょうどそれが5つの未満の答えを持っている可能性があるので、それは常に私のコードのロジックで5になりますと仮定カント)、としましたのスコアの合計は 5行までです。

代わりに、私が戻ってくるように見えるのは、カウントとして一致する行の合計数(ユーザーが1の場合)と、それらの行のスコアの合計です。数字は私がLIMIT 1またはLIMIT 5を置くかどうかを変更したりしても、私はこのような状況で動作すると信じて何50

を制限いけない、この代わりに

SELECT COUNT(*), SUM(score) FROM (SELECT * FROM answers WHERE user=1 LIMIT 5) AS a 

あるしかし、それは、そのような単純なクエリのために少し複雑なようですそれはトラフィックの多いスクリプトの中にあるので、できるだけパフォーマンスを上げるのが難しいです。

私に何か不足していますか?私は数年前からこの "問題" http://bugs.mysql.com/bug.php?id=50005に関連するように思われるこのバグ報告を見つけましたが、実際にはバグではないと仮定していますか?

+4

'LIMIT 5 'は多くとも5つの行を返します。 'SELECT COUNT(*)、SUM(score)FROM answers'は1行を返します。 1 <5.あなたは2番目のクエリで正しいです。 –

+0

YP @ ta.speot.is、私はちょっと愚かなことをしていないことを確認する誰かが必要だと思う。私は必要なものを行うためのより簡単なクエリがあったとは断言できましたが、明らかにそうではありませんでした。 – Lee

+2

ネストされたクエリで 'select * 'の代わりに' select 1'を使用すると、理論的にメモリ使用量が少なくなります –

答えて

30

これは実際にクエリがどのように動作するかであり、通常の動作です。 LIMITを使用すると、カウントまたは合計は制限されず、返された行のみが制限されます。したがって、クエリはLIMIT句に記載されているようにn行を返します。また、実際には1つの行しか返さないため、(ゼロ以外の)制限を適用しても結果には影響しません。

ただし、2番目のクエリは期待通りに機能し、この問題を解決するための確立された方法です。

+0

SOタイマが許可すると、私はあなたの答えを受け入れます。しかし、あなたは正しいです、私はあまりにも私を説明するために他の誰かが必要だったと思うので、私は愚かな何かをしていないことを知っていた。 2番目のクエリは機能し、それを実行する唯一の方法と思われます。 – Lee

+0

@Leeは正しいです、私はあなたを助けてうれしいです – Fabio