繁体   English   中英

选择每个外键的最高类型记录

[英]Select highest record of type per foreign key

我完全被看似简单的问题所困扰。 也许我只是感到困惑,因为我一直在思考/谷歌搜索/搜索它太久了。

请考虑下表:

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)

首先加入子查询:

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

您需要的是GROUP BY,如下面的查询:

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

而且对于多样性(虽然我使用@ 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
  )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM