2012-01-09 57 views
4

我完全无法理解似乎是一个简单问题。也许我只是困惑,因为我一直在思考/搜索/搜索太久。选择每个外键类型的最高记录

考虑下表:

log_id (auto increment primary key) 
domain_id (foreign key to "domains" table) 
type (enum('notice','warning')) 
message (varchar) 

执行以下选择:

SELECT * 
FROM logs 
WHERE domain_id = 4 

能给我,说,2个日志类型 '通知' 和式 '警告' 的3 。

我该如何去选择最高ID为type的日志?有效地给我最新日志为domain_idtype

只是描述这让我感到愚蠢,但我似乎无法得到它的权利..

感谢您的帮助。

克里斯

编辑: 以供将来参考,如果你想从第一个表中的所有记录并显示连接表的最新记录(在这种情况下,选择所有的域和他们最新的日志记录(如果可用)),只是保鲜膜选择上域表周围:

SELECT 
    domains.*, 
    logs.* 
FROM 
    domains 
LEFT JOIN (
    SELECT 
    l.* 
    FROM 
    logs l 
    INNER JOIN (
    SELECT 
     MAX(log_id) as maxid 
    FROM 
     logs 
    GROUP BY 
     domain_id 
     type 
) l3 ON l.log_id = l3.maxid 
) l2 USING (domain_id) 

回答

3

加入到一个子查询第一:

select 
    l.* 
from 
    log l 
    inner join (
    select 
     max(log_id) as maxid 
    from 
     log 
    group by 
     domain_id, 
     type 
    ) l2 on 
     l.log_id = l2.maxid 
+0

+ 1的打字速度比我快:) – MatBailie 2012-01-09 16:37:42

+0

谢谢埃里克,像一个魅力。 – Chris 2012-01-10 07:23:08

1

而对于品种(虽然我会使用@ Eric的回答)你可以使用EXISTS ...

SELECT 
    * 
FROM 
    log 
WHERE 
    NOT EXISTS (
    SELECT * 
    FROM log AS lookup 
    WHERE domain_id = log.domain_id 
    AND type = log.type 
    AND log_id > log.log_id 
) 
+0

感谢您的回答。 – Chris 2012-01-10 07:21:53

2

你需要的是一个GROUP BY,像下面这个查询:

SELECT `type`, MAX(`log_id`) AS `latest_log` 
FROM `logs` 
WHERE `domain_id` = 4 
GROUP BY `type`; 
+0

感谢您的回答。这会给我最高的ID,但我需要整个记录,也就是最高记录的消息。 – Chris 2012-01-10 07:21:20