2011-09-13 6 views
4

私は維持しているいくつかのレガシーコードを持っており、そこには私が理解していないSQLクエリがあります。ここの誰かが私の目的を説明できることを願っています。クエリは次のようになります。私は最後にgroup by nullせずに、このクエリを実行するとMySQLの "GROUP BY NULL"は何をしますか?

select * from product_performance 
where merchantid = 2151277 and clickday >= '2011-09-01' 
group by null; 

、私は44行を取得します。 group by nullで実行すると、前のセットの最初の行である1行が取得されます。ここで何が起きていますか、このグループを使用する目的は何ですか?

答えて

7

クエリ全体を一定の値でグループ化しています。これにより、行が効果的にランダムに選択されて返されます。 LIMIT 1を使って同じ結果を得ることができます。

このイディオムは標準SQLではありません。他のデータベースで試してみるとエラーが発生する可能性があります。 MySQLでは、ONLY FULL GROUP BY SQLモードを指定することにより、この動作を無効にすることができます。詳細はthe documentationを参照してください。

OTOH、LIMIT 1も標準ではありませんが、より広範にサポートされており、FETCH ... ONLY節のSQL:2008に準拠したデータベースでも同じ効果が得られます。詳細については、thisを参照してください。

0

笑、 はのは、このモードで説明しましょう: あなたが

select emp_id, dept_id 
from employees 
group by dept_id 

を持っている場合は、すべてのdepartamentに1つの行、および1つのEMP_ID、保証の限りではありませんを取得します。 これは、大きなデータがdepartamentsで吐き出されることを意味します。

あなたは

select emp_id, dept_id 
from employees 
group by dept_id, emp_id 

を撮影する場合は、DEPTSとEMPSによって分割さデータを取得します。

group by nullの場合は、は何も分割しないことを意味します。 グループは1つです。そして、mysqlはemp_idとdeptを与えますが、どの行から保証されているわけではありません。