0

結果が関数内で明示的に順序付けられるグループ関数を実行する必要があります。テーブル構造の例を次に示します(作成されたデータとともに)

id (int) | foo_id (int) | bar_id (int) | action (enum) | created (datetime)
1        | 17980        | 18           | added         | 2012-12-03 07:34:23
2        | 14321        | 17           | added         | 2013-01-06 07:34:23
3        | 9784         | 18           | added         | 2013-02-15 07:34:23
4        | 17980        | 18           | removed       | 2013-03-12 07:34:23
etc.

各 foo_id の最新のアクションを知りたいです。理想的には、次のようなものを実行します。

SELECT * FROM table WHERE bar_id = 18 GROUP BY foo_id ORDER BY created;

理想的な結果は次のようになります。

id | foo_id | bar_id | action  | created
3  | 9784   | 18     | added   | 2013-02-15 07:34:23
4  | 17980  | 18     | removed | 2013-03-12 07:34:23

foo_id = 17980 の場合、2 つのアクションが発生しました。最初のアクションで foo が追加され、2 番目のアクションで削除されました。私の理想的なグループ関数は、作成されたフィールドによって決定される最新のアクションを返すだけです。

私の知る限り、グループ関数は注文パラメーターを受け入れません。これを行う方法はありますか?助けてくれてありがとう。

4

3 に答える 3

1

group_concat()この情報を取得するために使用できるトリックがあります。

select substring_index(group_concat(id order by created desc), ',', 1) as id,
       foo_id, max(created) as MostRrecentCreated,
       substring_index(group_concat(bar_id order by created desc), ',', 1) as bar_id,
       substring_index(group_concat(action order by created desc), ',', 1) as action
from table
group by foo_id;

2 つのメモ。これにより、ロジックを使用するフィールドが文字列に変換されるため、それらを別の型にしたい場合は、元に戻す必要があります。action次に、コンマが含まれていないことを前提としています。

于 2013-08-05T02:49:09.067 に答える
1

最初GROUP BY foo_idにグラブMAX(created)してそれぞれの最新の日付を取得しfoo_id、次にJOINテーブルに戻ってこれらの値の他のすべての列を取得できます

SELECT * 
  FROM table1 t JOIN
(
  SELECT foo_id, MAX(created) created
    FROM Table1
   WHERE bar_id = 18
   GROUP BY foo_id
) q ON t.foo_id = q.foo_id 
   AND t.created = q.created
 ORDER BY t.created;

出力:

| | ID | FOO_ID | BAR_ID | アクション | 作成されました |
-------------------------------------------------- ------
| | 3 | 9784 | 18 | 追加 | 2013-02-15 07:34:23 |
| | 4 | 17980 | 18 | 削除されました | 2013-03-12 07:34:23 |

これがSQLFiddleのデモです

于 2013-08-05T02:35:38.943 に答える