web-dev-qa-db-ja.com

MySQLはMAX(datetime)が最大値を返さないことを選択します

サンプル表:

id   computer  app      version     build    date
---|---------|------|------------|-------|---------
1  |  aaaa1  | app1 |   1.0.0    |   1   | 2013-11-11 09:51:07
2  |  aaaa1  | app2 |   2.0.0    |   2   | 2013-11-12 09:51:07
5  |  xxxx2  | app1 |   1.0.0    |   1   | 2013-11-13 09:51:07
3  |  cccc3  | app2 |   3.1.0    |   1   | 2013-11-14 09:51:07
4  |  xxxx2  | app1 |   1.0.0    |   2   | 2013-11-15 09:51:07
5  |  cccc3  | app2 |   3.1.1    |   3   | 2013-11-16 09:51:07
6  |  xxxx2  | app1 |   1.0.2    |   1   | 2013-11-17 09:51:07
7  |  aaaa1  | app1 |   1.0.2    |   3   | 2013-11-18 09:51:07

目的の出力(正確な形式やリスト順ではない)、各コンピューターの各アプリの最新インストールを取得する:

7. aaaa1 - app1 - 1.0.2 - 3 - 2013-11-18 09:51:07
2. aaaa1 - app2 - 2.0.0 - 2 - 2013-11-12 09:51:07
6. xxxx2 - app1 - 1.0.2 - 1 - 2013-11-17 09:51:07
5. cccc3 - app2 - 3.1.1 - 3 - 2013-11-16 09:51:07

私のSQLステートメント:

SELECT 
        id,
        computer, 
        app, 
        version, 
        build, 
        MAX(date) AS installed
    FROM 
        data 
    WHERE 
        placement = 'xxx'
    GROUP BY 
        app, computer
    ;

これは私に与えます:

1. aaaa1 - app1 - 1.0.0 - 1 - 2013-11-11 09:51:07

ではなく

7. aaaa1 - app1 - 1.0.2 - 3 - 2013-11-18 09:51:07

私の期待通りに。

MAX(date)は、I [〜#〜] only [〜#〜] MAX(date)を選択した場合にのみ機能します。しかし、その後、私は(最新の日付だけで)動作するデータを取得しません。

SELECT 
        MAX(date) AS installed

私はSQLの忍者ではないので、このためにすぐに頭をかいてはげてしまいます。

10
DannyThunder

このようにしてみてください:

SELECT d.id, d.computer, d.app, d.version, d.build, a.installed
FROM data d
INNER JOIN (
  SELECT computer, app, max(DATE) AS installed
  FROM data
  GROUP BY computer, app
  ) a ON a.computer = d.computer AND a.app = d.app
WHERE placement = 'xxx'

内部クエリは、コンピューターとアプリの各ペアのmax(date)を取得します。その後、それに参加するだけで、残りの情報を取得できます。

10
Filipe Silva

日時フィールドをキャストしてみてください

 SELECT 
            id,
            computer, 
            app, 
            version, 
            build, 
            MAX(cast(date as Datetime)) AS installed
        FROM 
            data 
        WHERE 
            placement = 'xxx'
        GROUP BY 
           app, computer, id, version, build
        ;
5
par181

どうしたの:

SELECT 
    id,
    computer, 
    app, 
    version, 
    build, 
    `date` AS installed
FROM 
    data 
WHERE 
    placement = 'xxx'
ORDER BY installed DESC
GROUP BY app;
0
Gravy

日付を文字列として保存し、文字列を比較することは整数を比較することとは異なる動作をするためかもしれません。日付はnix Timestamp formatで保存する必要があり、比較しやすくなります。ただし、通常の英語の日付として表示するには追加の作業が必要になります。

0
artusat0r

MAXは私には機能しませんでした。機能したのは、日付でテーブルを事前に順序付けした追加のサブクエリでした。

SELECT d.id, d.computer, d.app, d.version, d.build, a.installed
FROM data d
INNER JOIN (
  SELECT computer, app, date as installed
  FROM (
    SELECT computer, app, date
    FROM data
    ORDER BY date desc
  ) as t
  GROUP BY computer, app
  ) a ON a.computer = d.computer AND a.app = d.app
WHERE placement = 'xxx'
0
Andrius K

max-selectステートメントのすべての列をGROUP BYに追加しようとする集約関数です。

GROUP BY 
    app, computer, id, version, build.
0
edem