4

これは以前に何度か尋ねられたことを理解していますが、かなり長い間、特定の問題にさまざまな既存のソリューションを適用しようとしましたが、成功しませんでした。それで、私は何らかのガイダンスを期待してここに来ます。

別のテーブルのさまざまな質問にリンクされた回答を含む tblanswers というテーブルがあります。私が望むのは、特定の質問 ID の各回答のカウントを取得することですが、毎月最初の n 件の回答に制限します。

tblanswers からのサンプル データ:

id  qid answer  timestamp
72  162 2       1366027324
71  161 4       1343599200
70  162 2       1366014201
69  161 4       1366011700
68  162 2       1366006729
67  161 3       1366010948
66  162 2       1365951084

これは私がこれまでに持っているクエリです:

SELECT *, COUNT(*) c FROM(
    SELECT answer, timestamp, YEAR(FROM_UNIXTIME(timestamp)) yr, MONTH(FROM_UNIXTIME(timestamp)) mo FROM tblanswers
        WHERE qid = 161
            ORDER BY timestamp ASC
) q GROUP BY YEAR(FROM_UNIXTIME(timestamp)), MONTH(FROM_UNIXTIME(timestamp)), answer

それは私に次のようなものを与えるでしょう: (サンプルデータの日付と数字は正確ではありません)

answer  yr      mo  c
1       2013    5   5
2       2013    5   3
3       2013    5   2
1       2013    6   5
2       2013    6   15
3       2013    6   7

1 か月に最初の 3 つの回答のみを表示したい場合、count が 3 を超えることはありません。毎月制限するにはどうすればよいですか?

最終的なデータは、次のように各回答の合計になります。

answer num_answers
1      2
2      3
3      3

これらのソリューションの 1 つが機能すると思いますが、どのように機能しないか: http://code.openark.org/blog/mysql/sql-selecting-top-n-records-per-group http://code.openark.org/ blog/mysql/sql-selecting-top-n-records-per-group-another-solution

どんな助けでも大歓迎です。ありがとう!

4

3 に答える 3

0

このソリューションはどうですか:

SELECT qid, answer, YEAR(FROM_UNIXTIME(timestamp)) yr, MONTH(FROM_UNIXTIME(timestamp)) mo, COUNT(*) no
FROM tblanswers
WHERE qid = 161
GROUP BY answer, yr, mo
HAVING COUNT(*) <= 2
ORDER BY timestamp ASC;

フィドル: http://sqlfiddle.com/#!2/1541eb/126

于 2013-06-29T06:36:25.013 に答える
0

このソリューションは、グループごとの上位 N 法に基づいています。

SELECT answer, COUNT(*) num_answers
FROM (SELECT answer, yearmonth,
             @rn := CASE WHEN @prevmonth = yearmonth
                         THEN @rn + 1
                         ELSE 1
                    END rn,
             @prevmonth := yearmonth
      FROM (SELECT @rn := NULL, @prevmonth := NULL) init,
           (SELECT answer,
                   YEAR(FROM_UNIXTIME(timestamp))*100+MONTH(FROM_UNIXTIME(timestamp)) yearmonth
            FROM tblanswers
            WHERE qid = 220
            ORDER BY timestamp) x) y

WHERE rn <= 3
GROUP BY answer

SQLFIDDLE

于 2013-06-29T00:54:20.350 に答える
-2

車輪を再発明して、バグのある、最適ではないコードを作成する危険を冒す理由はありません。あなたの問題は、一般的なグループごとの制限の問題の些細な拡張です(タグも参照)。この問題を解決するために、すでにテストされ、最適化されたソリューションがあります。

于 2013-06-28T22:45:43.250 に答える