5

MySQL テーブルがあるとします。

╔══════╦═════╦═════════╦═════════╗
║ 時間 ║ 半ば ║ field_1 ║ field_2 ║
╠══════╬═════╬═════════╬═════════╣
║ 100 ║ 1 ║ 32 ║ 54 ║
║ 100 ║ 2 ║ 0 ║ 34 ║
║ 100 ║ 3 ║ 44 ║ 99 ║
║ 200 ║ 1 ║ 0 ║ 45 ║
║ 200 ║ 2 ║ 0 ║ 45 ║
║ 200 ║ 3 ║ 4 ║ 59 ║
║ 200 ║ 4 ║ 45 ║ 45 ║
╚══════╩═════╩═════════╩═════════╝

time は UNIX タイムスタンプです。mid はメンバー ID です。field_1 はメンバーによって提供されます。field_2 は自動的に入力されます。

すべてのメンバーに対して、最新のゼロ以外の field_1 を持つ行を選択したいと考えています。したがって、クエリの結果は次のようになります。

╔══════╦═════╦═════════╦═════════╗
║ 時間 ║ 半ば ║ field_1 ║ field_2 ║
╠══════╬═════╬═════════╬═════════╣
║ 100 ║ 1 ║ 32 ║ 54 ║
║ 200 ║ 3 ║ 4 ║ 59 ║
║ 200 ║ 4 ║ 45 ║ 45 ║
╚══════╩═════╩═════════╩═════════╝

私が思いついた唯一の解決策は、あまりエレガントではないようです。

選択する *
から (
    選択する *
    から t1
    WHERE フィールド 1 > 0
    ORDER BY time DESC
) として
GROUP BY ミッド

より良い方法はありますか?

4

2 に答える 2

4

ここでの考え方は、timeそれぞれの最大値を取得し、midそれをテーブル自体に結合するサブクエリを作成することです。

SELECT a.*
FROM tableName a
INNER JOIN
(
SELECT mid, MAX(time) maxV
FROM tableName
WHERE field_1 > 0
GROUP BY mid
) b ON a.mid = b.mid and
        a.time = b.maxV

SQLFiddleデモ

于 2012-10-26T14:56:21.837 に答える
1
SELECT a.*
FROM t1 AS a
INNER JOIN
(
    SELECT mid, MAX(time) AS maxTime
    FROM t1
    WHERE field_1 <> 0
    GROUP BY mid
) b ON a.mid = b.mid AND a.time = b.maxTime

SQL フィドル

于 2012-10-26T14:59:57.560 に答える