Альтернатива отфильтрованному подзапросу - PullRequest
0 голосов
/ 09 июня 2011

У меня есть этот запрос, который работает как нужно, но, похоже, должен быть лучший способ выполнить то, что я хочу:

SELECT `x`.*
FROM (
    SELECT `m`.`id`,
        `m`.`email`,
        MAX(`s`.`end`) AS `max_end`
    FROM `members` AS `m`
    INNER JOIN `memberships` AS `s`
        ON `m`.`id` = `s`.`member_id`
    GROUP BY `m`.`id`,
        `m`.`email`
) AS `x`
WHERE `x`.`max_end` = '2010-02-28 23:59:59'

Я ищу участника, членство которого заканчивается на определенную дату,В таблице memberships есть столбцы start и end, содержащие даты, когда членство активно.Я только хочу посмотреть на последний завершающийся период членства, следовательно, MAX() и GROUP BY в подзапросе.

Ответы [ 2 ]

2 голосов
/ 09 июня 2011

Это можно переписать, используя having:

SELECT `m`.`id`,
    `m`.`email`
FROM `members` AS `m`
INNER JOIN `memberships` AS `s`
    ON `m`.`id` = `s`.`member_id`
GROUP BY `m`.`id`,
    `m`.`email`
HAVING MAX(`s`.`end`) = '2010-02-28 23:59:59'
1 голос
/ 09 июня 2011

Вы могли бы использовать подзапрос ... сделал это несколькими способами в моей голове и решил с этим:

select m.* 
from members m
where '2010-02-28 23:59:59' = (select MAX(x.end) 
                               from memberships x 
                               where x.member_id = m.id)

Редактировать: более быстрый подход, который ограничит первоначальную группу людьми, у которых было окончание членства в эту дату.

select m.* 
from members m
join memberships s on m.id = s.member_id
  and s.end = '2010-02-28 23:59:59'
where s.end = (select MAX(x.end) 
               from memberships x 
               where x.member_id = m.id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...