以下に説明する2つのテーブルがあります。必要なのは、特定の日数の間スコアが変化していないプレーヤーを教えてくれる単一のクエリです。
CREATE TABLE players (
pid INT(50),
name VARCHAR(255),
updatedAt DATETIME
);
CREATE TABLE pl_scores (
pid INT(50),
score INT(255),
updatedAt DATETIME
);
このplayers
テーブルには、すべてのプレイヤーのマスター リストと、簡潔にするためにここには示されていないその他の変更されないデータが保持されています。このpl_scores
テーブルは、成長や変化する可能性のあるその他の値を追跡するために、スコア変更の実行履歴を保持します。pl_scores
6 時間ごとに各プレイヤーの新しいレコードが挿入されます。
私が取得したいのはpid
、特定の日数でスコアが変化していないプレーヤーの数ですが、正しい値を取得するためにそれをグループ化する方法がわかりません.
サンプル データセット
(実際に比較する必要があるのは、毎日の最後のスコアのみを表示します)
+------+------+-------+------+---------+---------------------+
| pid | aid | score | rank | cityCnt | updatedAt |
+------+------+-------+------+---------+---------------------+
| 1660 | 0 | 801 | 2111 | 1 | 2012-06-20 22:14:11 |
| 1660 | 0 | 801 | 2250 | 1 | 2012-06-21 22:15:45 |
| 1660 | 0 | 801 | 2387 | 1 | 2012-06-22 22:17:06 |
| 1660 | 0 | 801 | 2547 | 1 | 2012-06-23 22:17:09 |
| 1660 | 0 | 801 | 2702 | 1 | 2012-06-24 22:19:50 |
| 1660 | 0 | 801 | 2836 | 1 | 2012-06-25 22:21:07 |
| 1660 | 0 | 801 | 2956 | 1 | 2012-06-26 21:42:44 |
+------+------+-------+------+---------+---------------------+
編集
以下の回答は完全に機能しましたが、さらに一歩進んで、3番目の表にあるハードコードされた値で結果を制限したいと思います。これが実際のSQLステートメントです
SELECT a.pid, c.aid, b.name AS pName, c.name AS aName, a.score FROM pl_scores AS a
JOIN players AS b ON a.pid = b.pid
JOIN alliances AS c ON b.aid = c.aid
WHERE a.updatedAt >= CURRENT_DATE() - INTERVAL 3 DAY GROUP BY a.pid HAVING MIN(a.score) = MAX(a.score);
各プレイヤーは、世界中に複数の都市を持っています。特定の大陸で見つかった都市を持つプレーヤーによる結果を制限したいと思います。たとえば、 continent で過去 3 日間スコアを変更していないすべてのプレーヤーを見つけたいとします34
。テーブルは次のcities
ようになります。
CREATE TABLE cities (
cid INT(50),
pid INT(50),
name VARCHAR(255),
cont INT(10),
updatedAt DATETIME
);