2011-09-05 28 views
8

ORDER BYの後にGROUP BYを実行する必要があります。 MySQLがなぜそれをサポートしていないのか分かりません。 これは私のコードです:ORDER BY後のGROUP BY

SELECT 
    `pages`.`id`, 
    `contents`.`id_language`, 
    [...] 

[...] 

ORDER BY 
    FIND_IN_SET(`languages`.`id`, '3') DESC 

[the GROUP BY] 

結果はこのようなものになります。

id | id_language | ... 
1 3 
1 1 
2 3 
2 5 
2 1 

私はIDによってグループに必要な、私は最初の結果を必要と私はビューに保存する必要があります。そのために私はSUBQUERYを使うことはできません。

結果はする必要があります

id | id_language | ... 
1 3 
2 3 

注:それはルールではないので、id_language = 3で混乱してはいけません。

答えて

1

グループByは結果セットをグループ化し、一般的に集約に使用されます。 注文Byは、結果がソートされる方法です。

+0

を使用してからの違いをしないid_language=3
ですだから私は使用することはできません

select * from your_table where id_language=3 order by id; 

を試してみてくださいこの場合のGROUP BY? –

1

GROUP BYの元のクエリに、現在グループ化しているものを追加する列が必要な場合があります。その列は、グループ分けされた後、その後の注文に使用できます。例えば:

SELECT 
    SUM(IF(`languages`.`id` = 3, 1, 0)) AS languageOrder, 
    `pages`.`id`, 
    `contents`.`id_language`, 
    [...] 

[...] 

[GROUP BY...] 

ORDER BY languageOrder DESC 

私は、言語#3、そうでない場合は0を含むグループが陽性であることをlanguageOrderためつもりでしょう。したがって、言語3を含むグループが最上位になります。

+0

ORDER BYは問題なく動作しますが、問題は各IDに最初に見つかった値だけです。 –

+0

私が正しく理解すれば、本当に必要なのは、各グループに対して、language_idに3が入っている行が返されたかったということです。 3つの行が1つしかない場合は、WHERE language_id = 3を実行できます。複数の場合がありますが、SQLはどのように表示するかを決定できますか? –

+0

Nop ...結果は、 '1 | 3'、' 1 | 5'、 '2 | 2'、' 2 | 5'のようなものです...各ID毎にFIRST FOUND ROW ...だから、この例の結果は '1 | 3'と' 2 | 2'だけです。 –

0

非常に面白いは、私の知る限り伝えることができ、ルールセットがwhere

7
SELECT id, idl 
FROM (SELECT 
    `pages`.`id` as id, 
    `contents`.`id_language` as idl, 
    [...] 

[...] 

ORDER BY 
    FIND_IN_SET(`languages`.`id`, '3') DESC 
    ) d 
GROUP BY d.id