3

データベーステーブルはこちら

╔════╦═════════════╦══════════════════╦═══════╗
║ id ║ customer_id ║    last_seen     ║ param ║
╠════╬═════════════╬══════════════════╬═══════╣
║  1 ║       12345 ║ 2012-08-01 12:00 ║     1 ║
║  2 ║       22345 ║ 2012-08-01 12:00 ║     1 ║
║  3 ║       32345 ║ 2012-08-01 12:00 ║     1 ║
║  4 ║       42345 ║ 2012-08-01 12:00 ║     1 ║
║  5 ║       52345 ║ 2012-08-01 12:00 ║     1 ║
║  6 ║       12345 ║ 2012-09-01 12:00 ║     2 ║
║  7 ║       12345 ║ 2012-10-01 12:00 ║     3 ║
╚════╩═════════════╩══════════════════╩═══════╝

ここidで、 は AUTO INCREMENT プライマリ キーです。

私が達成したいのは、それぞれの最後のレコードを取得することですcustomer_id。期待される結果 :

╔════╦═════════════╦══════════════════╦═══════╗
║ id ║ customer_id ║    last_seen     ║ param ║
╠════╬═════════════╬══════════════════╬═══════╣
║  2 ║       22345 ║ 2012-08-01 12:00 ║     1 ║
║  3 ║       32345 ║ 2012-08-01 12:00 ║     1 ║
║  4 ║       42345 ║ 2012-08-01 12:00 ║     1 ║
║  5 ║       52345 ║ 2012-08-01 12:00 ║     1 ║
║  7 ║       12345 ║ 2012-10-01 12:00 ║     3 ║
╚════╩═════════════╩══════════════════╩═══════╝

この SQL を試しましたが、正しくない結果が返されます:

SELECT customer_id, param, last_seen 
FROM `my_table` 
GROUP BY customer_id 
ORDER BY last_seen DESC 

ここで何が欠けていますか?

UPDATE : テーブル構造 ( の出力DESC my_table)

+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| id           | int(11)      | NO   | PRI | NULL    | auto_increment |
| customer_id  | varchar(8)   | NO   |     | NULL    |                |
| last_seen    | datetime     | NO   |     | NULL    |                |
| param        | int(11)      | NO   |     | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+
4

2 に答える 2

7

サブクエリの背後にある考え方は、last_seen各 の最新の値を個別に取得するというものCustomer_IDです。サブクエリの結果は、条件が満たされなければならないという条件で元のテーブルと結合されます:CustomerID日付が互いに一致する必要があります。

SELECT  a.*
FROM    Customer a
        INNER JOIN
        (
            SELECT Customer_ID, MAX(last_seen) maxDate
            FROM Customer
            GROUP BY Customer_ID
        ) b ON a.Customer_ID = b.Customer_ID AND
                a.last_seen = b.maxDate
ORDER BY a.ID

フォローアップの質問:last_seenレコード ID の値6が正しいか確認していただけますか?

于 2012-12-14T08:32:36.350 に答える
0

これがSQLFiddleのデモです

MySQLでは、次のように実行できます。

select ID,CUSTOMER_ID,LAST_SEEN,PARAM from
(
   select t.*,
       if(@i=customer_id,0,1) isLast,
       @i:=customer_id 
       from `my_table` t,(select @i:=0) t1 
   order by customer_id,last_seen desc
) t2 where isLAst=1
于 2012-12-14T08:45:15.737 に答える