2015-01-16 94 views
1

我有兩個表,一個名爲facebook_posts,另一個名爲facebook_post_metrics。在INNER JOIN中使用MAX - SQL

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_post_metrics的facebook_posts表和FBID ID。

所以後內加入,這個表應該是這樣的:

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 Query部分。請幫助我。

底線......我想要一臺看起來像這樣結束了:

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 
+2

那麼,MySQL還是SQL Server? – Lamak

回答

3

有了這樣的問題,我建議將它分解成塊,並把它重新走到一起。

尋找最近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; 

最後,您可以加入該查詢與一個有關條件facebook_post_metrics的idfbid列相匹配:

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示例。

+0

謝謝!但是,如果facebook_post沒有「updated_at」列呢? –

+0

如果沒有,那麼你如何知道使用哪個「名稱」?如果我知道'fbid = 1',那麼我無法知道是使用'a'還是'b'。 @ShivamSachaphimukh – AdamMc331

+0

只要來自facebook_posts的列「id」和來自facebook_post_metrics的「FBID」是相同的,那麼重要嗎? –

0

你需要一個subquerymax使用group by,然後用相同的表來獲取所有再次加入該計算細節

按最新編輯的update_at列沒有在帖子 不再出現,因爲有兩個條目,您可以通過一組由

,如果你は只有一次nt所有條目然後刪除外部查詢中的聚合和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

嘿謝謝! 對於後期版本感到抱歉......但是不會讓facebook_posts表中的「updated_at」變更很多? –

+0

@ShivamSachaphimukh,如果updated_at不存在,你需要在臉書上發佈哪一行 – radar

+0

@ShivamSachaphimukh,現在工作了嗎? – radar

0

未經測試,但您可以通過簡單地選擇相關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

中,這隻會引出最近的入口點,而不實際按FBID對其進行分組。 雖然謝謝,非常感謝。 –

+0

這很奇怪,除了幾個列名之外,我錯了,輸出看起來完全像你的問題中的預期輸出。我已經添加了小提琴 – Spock