sql - 在 INNER JOIN - SQL 中使用 MAX

标签 sql

我有两个表,一个叫 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;

最后,您可以在 idfbid 列匹配的情况下将该查询与 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/

相关文章:

mysql - 如何在 SQL 中使用其他几个列的值来创建一个列?

sql - SQL Server 中 ISNULL 函数的截断问题

sql - 什么会导致我的客户端服务器上的高缓冲区 I/O?

sql - 用于比较唯一性的 MSSQL 查询

php - 选择查询的输出用作 php 中其他查询的输入

sql - 复杂 ActiveRecord 案例中大小、长度和计数之间的差异

sql - h2 sql,用多列主键创建表?

MySQL 查询错误,名为 "order"的表

mysql - 如何根据两个日期从表中的日期列中获取缺失的日期

mysql - 如果一列中有一个相同的值并更改列名称,如何将两行合并为一行