GROUP BY也是SELECT非常量列

时间:2012-11-02 16:46:10

标签: mysql sql select group-by greatest-n-per-group

我的数据库中有2个表:

log_visitors:
--------------------
id | host_id


log_access:
--------------------
visitor | document | timestamp

log_access.visitor指向log_visitors.id

的链接

目前,我正在使用此查询:

SELECT
    log_visitors.host_id
    , MIM(log_access.timestamp) AS min_timestamp
FROM
    log_access
    INNER JOIN log_visitors
        ON (log_access.visitor = log_visitors.id)
GROUP BY log_visitors.host_id;

为数据库中的每个MIN(timestamp)获取host_id

这是我的问题:

我还需要使用该时间戳获取document访问权限...我不能简单地将log_access.document添加到SELECT列表中,因为它不是常量而我不按文档分组。 。 有什么想法吗?

2 个答案:

答案 0 :(得分:5)

您没有指定DBMS,但这是ANSI SQL(适用于大多数现代DBMS)

select *
from (
  SELECT log_visitors.host_id,
         log_visitors.document,
         log_access.timestamp
         min(log_access.timestamp) OVER (partition by log_visitors.host_id) AS min_timestamp
  FROM log_access
    JOIN log_visitors ON (log_access.visitor = log_visitors.id)
) t
where t.timestamp = t.min_timestamp
ORDER BY host_id

答案 1 :(得分:3)

以下内容应该能满足您的需求:

SELECT      lv.host_id,
            mv.MinTime,
            la.document

FROM        log_visitors AS lv
INNER JOIN     
            (SELECT visitor, 
                    MIN(timestamp) AS MinTime 
             FROM log_access 
             GROUP BY visitor) AS mv ON lv.id = mv.visitor
INNER JOIN  log_access AS la ON lv.id = la.visitor AND mv.MinTime = la.timestamp

我们所做的是获取表中所有访问者和最小时间戳的列表,加入到该表中,然后加入到时间戳上的日志访问中以选择特定文档。

这使用ANSI SQL-92,因此应该适用于广泛的数据库系统,包括那些不支持窗口函数的系统。

以下是通过Sql Fiddle

执行查询的示例