2

ユーザーごとに 1 つの行のみを表示したい状況で、いくつかのテーブルを結合して多数の行を生成するクエリがあります。group by user.id を使用して「1 人のユーザーのみ」の問題を解決しましたが、ユーザーごとに、(最後ではなく) 最初のエントリを表す結合テーブルから値を取得していることに気付きました。

つまり言い換えれば

user:
id | phone

item:
id | user_id | timestamp

私の意図は、これらのテーブルに参加し、(タイムスタンプまたは item.id desc に基づいて) 最新のアイテムを選択することですが、(各ユーザーが持っているすべてのアイテムを表示するのではなく) ユーザーごとに 1 つのアイテムのみを取得することです。 group by user.idユーザーごとに 1 つのアイテムのみを提供するという問題を解決しますが、常に item.id が最も小さい最初のアイテムが表示されますが、最新のアイテムが必要です。

これを達成するためのより良い方法はありますか...私は最初はうんざりしていましdistinctたが、それはうまくいかないようです。

ティア

[編集] 以下の Jocelin の質問への回答: select user.id, item.timestamp from item join user on user.id = item.user_id order by user.id

4

3 に答える 3

1

ORDER BYwithDESC句を使用します。

select 
  user.id, item.timestamp 
from 
  item 
join 
  user on user.id = item.user_id 
group by
  user.id
order by 
  user.id DESC

あなたの問題は実際にはあなたが説明したものではないのではないかと(以下のコメントから)疑っています。代わりに、次のようなことを試してください (MySQL を使用していないため未テストです。SQL Server と SQLite で動作します)。

select
  user.id, i.ts
from 
  (select id, max(timestamp) as ts from items group by id) i
join
  user u on u.id = i.id
于 2012-08-22T23:35:39.143 に答える
1

mysql には、各グループの最初の行のみを取得するための「チート」があります。

select *
from (select
        u.id as user_id,
        u.name,
        i.id as item_id,
        i.timestamp
      from user u
      join item i on i.user_id = u.id
      order by timestamp desc -- "desc" = order descending
    ) x
group by user_id

「ごまかし」は、mysql では、グループ化されていない列を集計できないことです(私が知っている他のすべてのデータベースとは異なります)。SQL 構文エラーを返す代わりに、各グループの最初のレコードのみを返します。SQL 標準ではありませんが、非常に便利です。

この利点は、非常に遅い相関サブクエリが必要ないことです。

内部クエリは、レコードをタイムスタンプの最新順で並べ替えるために使用されるため、各ユーザーで最初に検出されたレコードが「最新」になります。

于 2012-08-23T00:11:05.347 に答える
0

を使用する必要がありますJOIN。まず、ユーザーごとにサブセレクト グループを作成し、MAXタイムスタンプを選択します。これにより、ユーザーごとに 1 つの行が取得され、最新のエントリが表示されます (他のすべてのフィールドは失われます)。

次に、式のタイムスタンプを使用して結合し直しJOIN、不足しているフィールドを復元します。

申し訳ありませんが、テーブル スキーマがなければ、これより具体的にするのは簡単ではありません。JOIN参照がクエリを変更する正しい方向を示していることを願っています。

于 2012-08-22T23:57:59.327 に答える