2010-07-21 2 views
1

У меня есть таблица, которая отслеживает серийные номера и количество лицензий, связанных с указанным серийным номером. Клиент может повторно лицензировать ящик, увеличивая или уменьшая количество пользователей, и они оплачиваются только за измененную сумму.SQL Group По вопросу - выбор группировки строк

Следующая структура таблицы существует:

id - Auto Incrementing ID 
serial - The serial number 
numusers - the number of licenses 
date - The date that the request was submitted, with the highest date being the number of users currently licensed 

У меня есть следующий запрос, чтобы выбрать лицензии, которые были обновлены, и это работает, если лицензия была только один раз повторно. Если он был повторно отправлен несколько раз, он возвращает ссылки на предыдущее обновление и все обновления до этого.

SELECT p.id as id, c.id as oldid, p.numusers-c.numusers AS dif, p.date, c.date 
FROM `licenses` AS p 
JOIN `licenses` AS c ON p.serial = c.serial 
        AND p.date > c.date 
        AND p.id <> c.id 
WHERE p.id = 156 
#GROUP BY p.id 

Вот набор данных:

id serial numusers date 
26 1234 500   2010-07-14 
34 1234 600   2010-07-15 
156 1234 500   2010-07-21 

При запуске запроса, я получаю следующее:

id  oldid  dif   date   date 
156  26   0   2010-07-21 2010-07-14 
156  34   -100  2010-07-21 2010-07-15 

Если я раскомментировать предложения GROUP BY в запросе, я получаю строка со старым 26. Как я могу выбрать только строку с самой последней датой (строка со старым из 34)? Я мог бы использовать ORDER BY и LIMIT 1, но я также хочу иметь возможность выбирать из всей таблицы без предложения WHERE.

Я использую MySQL 5.1.

ответ

1

Может быть, что вы хотите:

select p.id, c.id as priorid, p.numusers-c.numusers AS dif, p.date, c.date as priordate  
from licenses p 
join licenses c on c.serial=p.serial 
    and c.date=(select max(date) from licenses ref where ref.serial=p.serial 
    and ref.date<p.date) 
order by p.serial 

Я всегда находил это довольно досадное ограничение SQL, что сказать «получить мне поле X из записи с max для поля Y "требует, чтобы я один раз прочитал таблицу, чтобы найти максимальное значение Y со встроенным запросом, а затем снова прочитать его, чтобы повторно найти запись с этим значением и получить другие значения, которые я хочу.

Если есть три записи для одного и того же серийного номера, то вышеприведенное должно содержать две строки «разности» на выходе. Я думаю, это то, что ты хочешь сказать. Если для данной Serial имеется только одна запись, вышесказанное не даст выхода для этого Сериала, который может быть тем, что вы хотите, а может и нет.

+0

Это именно то, что я хотел, спасибо. Я понял, что существует более простой способ SQL «получить поле X из записи с максимальным значением для поля Y», но, я думаю, нет. – HalfBrian

1

Будет ли использоваться производная таблица; что-то вроде ...

SELECT * 
    FROM (SELECT p.id as id, 
       c.id as oldid, 
       p.numusers-c.numusers AS dif, 
       p.date, 
       c.date 
       FROM `licenses` AS p JOIN `licenses` AS c ON p.serial = c.serial 
        AND p.date > c.date 
        AND p.id <> c.id 
       ORDER BY oldid DESC) AS inner_table 
    GROUP BY id; 
Смежные вопросы