Выберите наибольшую запись типа для внешнего ключа - PullRequest
4 голосов
/ 09 января 2012

Я полностью озадачен тем, что кажется простой проблемой. Может быть, я просто сбит с толку, потому что слишком долго думал / гуглял / искал вокруг.

Рассмотрим следующую таблицу:

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 типа «предупреждение».

Как бы я выбрал только журналы с наибольшим идентификатором их type? Эффективно давая мне последний журнал за domain_id и type.

Просто описывая это, я чувствую себя глупо, но я не могу понять, что это правильно ..

Спасибо за вашу помощь.

Chris

Edit: Для дальнейшего использования, если вы хотите выбрать все записи из первой таблицы и показать последнюю запись объединенной таблицы (в этом случае выберите все домены и их последнюю запись в журнале (если доступно)), просто оберните выборку в доменах. стол вокруг него:

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 ]

3 голосов
/ 09 января 2012

Сначала присоединиться к подзапросу:

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
2 голосов
/ 09 января 2012

Что вам нужно, это GROUP BY, как этот запрос ниже:

SELECT `type`, MAX(`log_id`) AS `latest_log`
FROM `logs`
WHERE `domain_id` = 4
GROUP BY `type`;
1 голос
/ 09 января 2012

А для разнообразия (хотя я бы использовал @ ответ Эрика) вы можете использовать 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
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...