2

のデータの下にグループ化したいsub_prd_idしかしその前に、 max からの注文データが必要created_atです。

以下のようにクエリを書きました。

select * FROM prd_data group by sub_prd_id order by created_at desc

しかし、このクエリは必要なものを返しませんでした。たとえば、以下のデータによると、クエリの実行後、結果は次のようになります。

id  name    sub_prd_id  created_at
4   Grape     10            2013-04-28 03:11:55
6   Banana    11            2013-04-28 03:23:14
7   Pineapple 12            2013-04-28 03:23:44

これがデータを含むテーブル構造です。

id  name    sub_prd_id  created_at
2   Apple     10            2013-04-28 03:04:51
3   Orange    10            2013-04-28 03:08:19
4   Grape     10            2013-04-28 03:11:55
5   Mango     11            2013-04-28 03:22:48
6   Banana    11            2013-04-28 03:23:14
7   Pineapple 12            2013-04-28 03:23:44
4

4 に答える 4

6

あなたが達成しようとしているのは、グループごとの最大値として知られていますが、これは を使用して達成することはできませんORDER BY。代わりに、 を見つけてMAX()、結果をテーブルに結合する必要があります。

SELECT prd_data.* FROM prd_data NATURAL JOIN (
  SELECT   sub_prd_id, MAX(created_at) created_at
  FROM     prd_data
  GROUP BY sub_prd_id
) t

sqlfiddleで参照してください。

于 2013-04-28T08:33:21.887 に答える
2

あなたの勘は正しかった。これにより、次のようになります。

select * from
  (select * from prd_data order by created_at desc) x
group by sub_prd_id

これはmysqlのみの解決策であることに注意してください。ただし、質問にはmysqlのタグが付けられているため、問題ありません。集計されていない列の一部のみがグループ化されている場合、Mysql にはグループ化に関する特別な機能があります。他のすべてのデータベースはこれを許可していませんが、mysql は組み合わせごとに一意のグループごとに検出された最初の行を返します。グループ化する前にソートすることにより、各 sub_prd_id の最新の created_at 値を持つ行を取得します。

于 2013-04-28T08:53:37.400 に答える
1
SELECT x.* 
  FROM prd_data x 
  JOIN 
     ( SELECT sub_prd_id
            , MAX(created_at) max_created_at 
         FROM prd_data 
        GROUP 
           BY sub_prd_id
     ) y 
    ON y.sub_prd_id = x.sub_prd_id 
   AND y.max_created_at = x.created_at;
于 2013-04-28T15:08:33.517 に答える
0

クエリ (常に機能しますが、他のクエリよりも遅くなります):

SQLFIDDLE例

SELECT t1.*
FROM prd_data t1
WHERE t1.id = (SELECT t2.id
               FROM prd_data t2
               WHERE t2.sub_prd_id= t1.sub_prd_id
               ORDER BY t2.created_at DESC
               LIMIT 1)

その他のクエリ (sub_prd_id に MAX 値が 1 つある場合にのみ機能します):

SELECT t1.*
FROM prd_data t1
WHERE t1.created_at = (SELECT MAX(t2.created_at)
                       FROM prd_data t2
                       WHERE t2.sub_prd_id= t1.sub_prd_id)

結果:

| ID |      NAME | SUB_PRD_ID |                   CREATED_AT |
--------------------------------------------------------------
|  4 |     Grape |         10 | April, 28 2013 03:11:55+0000 |
|  6 |    Banana |         11 | April, 28 2013 03:23:14+0000 |
|  7 | Pineapple |         12 | April, 28 2013 03:23:44+0000 |
于 2013-04-28T15:13:36.173 に答える