【问题标题】:Join with Max and pre-Max row加入 Max 和 pre-Max 行
【发布时间】:2016-03-15 07:46:11
【问题描述】:

我有两个表“站点”和“索引日志”。表 'sites' 是有关站点的信息(用户 ID、名称、描述 ...) 表 index_log 有列 date、index_count 和 siteid。所以我想获取每个站点的最后一个和上一个 index_log 行,其中 userid = 10。这是我的变体:

 SELECT ff.id,
        ff.siteurl,
        ff.last_count,
        ff.last_date,
        il2.index_count as previous_count,
        MAX(il2.date) as previous_date
FROM (
    SELECT s.siteurl,
            s.id,
            il.index_count as last_count,
            MAX(il.date) as last_date
    FROM sites s 
    LEFT JOIN index_logs il ON il.siteid = s.id
    WHERE s.userid = 10
    GROUP BY s.id
    ) as ff
LEFT JOIN index_logs il2 ON il2.siteid = ff.id AND il2.date < ff.last_date
GROUP BY ff.id

但在此变体中,index_count 列(最后一个和上一个)与最大日期行不匹配。希望对您有所帮助。

【问题讨论】:

  • 这不是有效的 SQL Server 查询,看起来像 mysql?
  • 是什么让你这么说@dnoeth?
  • GROUP BY 不包括 SELECT 列表中的所有非聚合列...
  • MS SQL 不允许这样做。你的意思是它在 MySQL 中是允许的?
  • @Squirrel:是的,这在 mysql 中做了很多(返回一些随机行),当他们切换到任何其他 DBMS 时,他们想知道为什么它不再工作了?

标签: mysql sql join group-by max


【解决方案1】:

这将为您提供每个 sites.id 的最后 2 个日志条目

; with CTE as
(
    SELECT s.siteurl, s.id, il.index_count, il.date, 
           RN = ROW_NUMBER() OVER (PARTITION BY s.id ORDER BY il.date DESC)
    FROM   sites s
    JOIN   index_logs il ON il.siteid = s.id
    WHERE  s.userid = 10
)
SELECT *
FROM   CTE
WHERE  RN <= 2

【讨论】:

  • 我不知道你在使用 MySQL
  • MySQL 有没有类似 ROW_NUMBER() 的函数?
  • 不,没有,主要问题是'with',但已经不是问题了,我使用php过滤进行完全连接。
  • 感谢您的帮助!不幸的是,我没有足够的声望让你加分。
猜你喜欢
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-05
相关资源
最近更新 更多