我有两个表,一个叫 facebook_posts,另一个叫 facebook_post_metrics。
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
因此,用于内部联接的公共(public)列是来自 facebook_posts 表的 id 和来自 facebook_post_metrics 的 FBID。
所以在内部 Join 之后,表应该如下所示:
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示例。
关于sql - 在 INNER JOIN - SQL 中使用 MAX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27991484/