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
このような問題が発生した場合は、分割して元に戻すことをお勧めします。
次のように、最新の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 の例です。
テストされていませんが、問題の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
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