web-dev-qa-db-ja.com

INNER JOIN内でのMAXの使用-SQL

1つはfacebook_posts、もう1つはfacebook_post_metricsという2つのテーブルがあります。

facebook_postsは次のようになります

NAME    id                      
a         1           
b         1            
c         4             
d         4             

facebook_post_metricsは次のようになります

number    FBID       Date_Executed             User_Executed
1         1        2012-09-18 16:10:44.917   admin
2         1        2012-09-25 11:39:01.000   jeff
3         4        2012-09-25 13:20:09.930   steve
4         4        2012-09-25 13:05:09.953   marsha

したがって、内部結合に使用される共通の列は、facebook_postsテーブルのidとfacebook_post_metricsのFBIDです。

したがって、内部結合の後、テーブルは次のようになります。

  name  number           FBID            Date_Executed             User_Executed
   a       1               1             2012-09-18 16:10:44.917   admin
   b       2               1             2012-09-25 11:39:01.000   jeff
   c       3               4             2012-09-25 13:20:09.930   steve
   d       4               4             2012-09-25 13:05:09.953   marsha

ただし、この内部結合を行うときに別の条件を含めたいと思います。基本的に、私は上記の結合されたテーブルの最新のエントリが欲しいだけです。私はmax(date_executed)を使用し、それをFBIDでグループ化することを知っています。しかし、INNER JOINを使用するときにSQLクエリのどの部分に入るのかはわかりません。私を助けてください。

結論...私はこのようなテーブルになってしまいたい:

  name  number           FBID            Date_Executed             User_Executed
   b       2               1             2012-09-25 11:39:01.000   jeff
   c       3               4             2012-09-25 13:20:09.930   steve
7

このような問題が発生した場合は、分割して元に戻すことをお勧めします。

次のように、最新のfacebook_posts_metrics行の日付を見つけるのは簡単です。

SELECT fbid, MAX(date_executed) AS latestDate
FROM facebook_post_metrics
GROUP BY fbid;

したがって、行全体を取得するには、元のテーブルとそれらの結果を結合する必要があります。

SELECT fpm.*
FROM facebook_post_metrics fpm
JOIN(
  SELECT fbid, MAX(date_executed) AS latestDate
  FROM facebook_post_metrics
  GROUP BY fbid) t ON t.fbid = fpm.fbid AND t.latestDate = fpm.date_executed;

最後に、名前を取得するには、facebook_postsテーブルと結合するだけです。

SELECT fp.name, fpm.number, fpm.fbid, fpm.date_executed, fpm.user_executed
FROM facebook_posts fp
JOIN(
  SELECT fpm.*
  FROM facebook_post_metrics fpm
  JOIN(
    SELECT fbid, MAX(date_executed) AS latestDate
    FROM facebook_post_metrics
    GROUP BY fbid) t ON t.fbid = fpm.fbid AND t.latestDate = fpm.date_executed
  ) fpm ON fpm.fbid = fp.id AND fpm.date_executed = fp.updated_at;

これが SQL Fiddle の例です。

[〜#〜]編集[〜#〜]

あなたのコメントに基づいて、あなたのデザインを見直すと、私はあなたがこのようなことができると信じています。まず、上記で説明した最新のfacebook_post_metricsを入手します。次に、同様の方法を使用して、最新のfacebook_postを取得します。これは、facebook投稿の最新のupdated_at値を検索します。別の日付列を使用する場合は、次のように変更します。

SELECT fp.*
FROM facebook_posts fp
JOIN(
  SELECT id, MAX(updated_at) AS latestUpdate
  FROM facebook_posts
  GROUP BY id) t ON t.id = fp.id AND t.latestUpdate = fp.updated_at;

最後に、id列とfbid列が一致するという条件で、facebook_post_metricsのクエリとそのクエリを結合できます。

SELECT fp.name, fpm.number, fpm.fbid, fpm.date_executed, fpm.user_executed
FROM(
  SELECT fp.*
  FROM facebook_posts fp
  JOIN(
    SELECT id, MAX(updated_at) AS latestUpdate
    FROM facebook_posts
    GROUP BY id) t ON t.id = fp.id AND t.latestUpdate = fp.updated_at) fp
JOIN(
  SELECT fpm.*
  FROM facebook_post_metrics fpm
  JOIN(
    SELECT fbid, MAX(date_executed) AS latestDate
    FROM facebook_post_metrics
    GROUP BY fbid) t ON t.fbid = fpm.fbid AND t.latestDate = fpm.date_executed) fpm
ON fp.id = fpm.fbid;

以下は、更新された SQL Fiddle の例です。

6
AdamMc331

テストされていませんが、問題のFBIDの最大日付を選択するだけで実行できます。このようなもの...

SELECT fb.name, fpm.number, fpm.FBID, fpm.date_executed, fpm.user_executed
FROM facebook_post_metrics fpm
    join facebook_posts fb ON fpm.fbid = fb.id AND fb.updated_at = fpm.date_executed
WHERE fpm.Date_Executed = (
SELECT MAX(f.Date_executed)
FROM facebook_post_metrics f
WHERE f.FBID = fpm.fbid)

ここではフィドル http://sqlfiddle.com/#!2/1485d/15

0
Spock

group byを使用してsubqueryを計算したmaxが必要であり、すべての詳細を取得するために同じテーブルと再度結合します

最新の編集によると、2つのエントリがあるため、投稿にupdate_at列はありません。

すべてのエントリが必要な場合は、集計と外部クエリのgroup byを削除します。

select max(fp.name), fpm.number, fpm.FBID, fpm.date_executed,
       fpm.user_executed
from facebook_posts fp
join ( select max(Date_executed) dexecuted, FBID
       from facebook_post_metrics 
       group by FBID
      ) t
on fp.id = t.fbid
join facebook_post_metrics fpm
on fpm.fbid = t.fbid
and fpm.date_executed = t.dexecuted
group by fpm.number, fpm.FBID, fpm.date_executed,
       fpm.user_executed
0
radar