3

プログラムの関数の使用に関する統計を含む MySQL テーブルがあります。私がそこから取得したものは、基本的に次のようになります (合計トップ 15 をここに示します)。

SELECT function_id, data_timer, SUM( data_counter ) total 
FROM data
GROUP BY function_id 
ORDER BY total DESC

+-------------+------------+-------+
| function_id | data_timer | total |
+-------------+------------+-------+
|          56 |        567 |  4389 |
|          23 |       7880 |  1267 |
|           7 |        145 |   812 |
|         ... |        ... |   ... |
+-------------+------------+-------+

これらの結果は、ユーザーが ORDER BY および ASC と DESC の間で使用する列を選択できる Web サイト モジュールで使用されるため、結果の各行のランクを取得する必要がありました。

この質問の助けを借りて、結果の各行にランクを割り当てることができました。

SET @rank = 0;
SELECT @rank:=@rank+1 AS rank, function_id, data_timer, SUM( data_counter ) total
FROM data 
WHERE client_id = 2 
GROUP BY function_id 
ORDER BY total DESC

+------+-------------+------------+-------+
| rank | function_id | data_timer | total |
+------+-------------+------------+-------+
|    1 |          56 |        567 |  4389 |
|    2 |          23 |       7880 |  1267 |
|    3 |           7 |        145 |   812 |
|  ... |         ... |        ... |   ... |
+------+-------------+------------+-------+

このテーブルを反転しようとすると、いくつかの問題が発生します。つまり、最初に最も使用されていない関数で結果をソートしたいと考えています。このようなもの(76個の関数があると仮定):

+------+-------------+------------+-------+
| rank | function_id | data_timer | total |
+------+-------------+------------+-------+
|   76 |          44 |        346 |     1 |
|   75 |           2 |       3980 |     4 |
|   74 |          13 |        612 |     7 |
|  ... |         ... |        ... |   ... |
+------+-------------+------------+-------+

これが私のSQLクエリの試みです:

SELECT rank, function_id, data_timer, total
FROM
(
SET @rank = 0;
SELECT @rank:=@rank+1 AS rank, function_id, data_timer, SUM( data_counter ) total
FROM data 
WHERE client_id = 2 
GROUP BY function_id 
ORDER BY total DESC
)
ORDER BY rank DESC

それは私にこれをポップし続けます:

#1064 - You have an error in your SQL syntax; check the manual that 
corresponds to your MySQL server version for the right syntax to use near 
'SET @rank = 0' at line 4

私はSQLにあまり熟練していないので、明らかな何かが欠けていると思います。

どんな助けでも喜んで感謝します、ありがとう!

4

2 に答える 2

2

サブクエリ内で変数を割り当てようとしています。これはうまくいきません。割り当てをサブクエリの外に移動すると、実行されます。

SET @rank = 0;
SELECT rank, function_id, data_timer, total
FROM
(
SELECT @rank:=@rank+1 AS rank, function_id, data_timer, SUM( data_counter ) total
FROM data 
WHERE client_id = 2 
GROUP BY function_id 
ORDER BY total DESC
)
ORDER BY rank DESC
于 2013-06-04T16:15:26.797 に答える
1

別のオプションは@rank、別のステートメントではなく、クエリで変数を初期化することです。

SELECT rank, function_id, data_timer, total
FROM
(
    SELECT @rank:=@rank+1 AS rank, function_id, data_timer, SUM( data_counter ) total
    FROM data, 
        (SELECT @rank := 0 ) r
    WHERE client_id = 2 
    GROUP BY function_id 
    ORDER BY total DESC
) r
ORDER BY rank DESC
于 2013-06-04T16:24:50.160 に答える