2

私がやろうとしているのは、最後の 4 つの person_id を取得して合計することです。これが私の現在のMySQLクエリです。最終的には person_id 23 = 4 になります。LIMIT を 7 に変更すると、person_id 23 = 6、person_id 24 = 2 になります。必要なのは

person_id 23 = 4
person_id 24 = 8
person_id 25 = 12

私は何を間違っていますか?

SELECT SUM(ms.value) AS value, ms.person_id
FROM
    (SELECT mst.value, mst.id, mst.person_id
    FROM match_statistic AS mst
    WHERE mst.person_id IN (23,24,25)
    ORDER BY mst.id ASC
    LIMIT 4) AS sub
INNER JOIN match_statistic AS ms ON sub.id = ms.id
GROUP BY ms.person_id


  match_statistic table
| id | person_id | value |
| 10 |    23     |   1   |
| 11 |    23     |   1   |
| 12 |    23     |   1   |
| 13 |    23     |   1   |
| 14 |    23     |   1   |
| 15 |    23     |   1   |
| 16 |    24     |   2   |
| 17 |    24     |   2   |
| 18 |    24     |   2   |
| 19 |    24     |   2   |
| 20 |    24     |   2   |
| 21 |    24     |   2   |
| 22 |    25     |   3   |
| 23 |    25     |   3   |
| 24 |    25     |   3   |
| 25 |    25     |   3   |
| 26 |    25     |   3   |
| 27 |    25     |   3   |
4

2 に答える 2

2

このSQL FIDDLEをチェックすることもできます

SELECT SUM(ms.value) AS value, ms.person_id FROM (
SELECT a.id, a.person_id, a.value, count(*) as row_number 
FROM MATCH_STATS a
JOIN MATCH_STATS b ON a.person_id = b.person_id AND a.id <= b.id
GROUP BY a.id, a.person_id, a.value
) ms  WHERE ms.person_id IN (23,24,25) and row_number < 5
GROUP BY ms.person_id

また

現在のクエリの場合、内部クエリを次のように変更します

SELECT mst.value, mst.id, mst.person_id
    FROM match_statistic AS mst
    WHERE mst.person_id IN (23)
    ORDER BY mst.id ASC
    LIMIT 4

UNION ALL
SELECT mst.value, mst.id, mst.person_id
    FROM match_statistic AS mst
    WHERE mst.person_id IN (24)
    ORDER BY mst.id ASC
    LIMIT 4

UNION ALL
SELECT mst.value, mst.id, mst.person_id
    FROM match_statistic AS mst
    WHERE mst.person_id IN (25)
    ORDER BY mst.id ASC
    LIMIT 4
于 2012-10-16T21:48:38.330 に答える
0

このようなことを試してください。リスト内のグループの数を知らなくても、もう少し一般的です。答えは結果にあります。動作を確認できるように、余分な行をいくつか残しました。最終的な解決策になるわけではありません。正しい方向への大きなプッシュです。

データベースがウィンドウ関数をサポートしている場合は、ウィンドウ関数を使用できることに注意してください。

SELECT t1.id
     , SUM(t2.value)
     , t1.person_id
     , COUNT(t2.id) AS cnt
  FROM theTable AS t1
  LEFT JOIN theTable AS t2
    ON (t1.id) <= (t2.id)
   AND t1.person_id = t2.person_id
 GROUP BY t1.id
        , t1.person_id
HAVING cnt <= 4 AND t1.person_id IN (23, 24, 25)
 ORDER BY t1.person_id, cnt
 ;
于 2012-10-16T22:25:39.573 に答える