Выборка двух максимумов из двух разных месяцев MySql

Помогите доделать запрос. Есть два отдельно работающих запроса:

Максимальное число за прошлый месяц:

SELECT `maindata`
FROM `counterdata`
WHERE 
`idapart`=1 AND `idcounterosbb`=4
AND `datarec` > LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 2 MONTH 
AND `datarec` < DATE_ADD(LAST_DAY(CURDATE()) - INTERVAL 1 MONTH, INTERVAL 1 DAY)
ORDER BY `maindata` DESC
LIMIT 1 

И максимальное число за текущий месяц

SELECT a.`maindata`
FROM `counterdata` a
WHERE 
a.`idapart`=1 AND a.`idcounterosbb`=4
AND a.`datarec` > LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH 
AND a.`datarec` < DATE_ADD(LAST_DAY(CURDATE()) - INTERVAL 0 MONTH, INTERVAL 1 DAY)
ORDER BY a.`maindata` DESC
LIMIT 1

А как их объединить в одном запросе и получить разницу? Через UNION просто получаем два числа, а желательно поставить их в одну строку, и вычислить разницу.

Вот так попробовал:

SELECT a.`maindata` as maxdata, b.`maindata` as mindata
FROM `counterdata` a
LEFT JOIN
(
    SELECT `maindata`
    FROM `counterdata`
    WHERE 
    `idapart`=1 AND `idcounterosbb`=4
    AND `datarec` > LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 2 MONTH 
    AND `datarec` < DATE_ADD(LAST_DAY(CURDATE()) - INTERVAL 1 MONTH, INTERVAL 1 DAY)
    ORDER BY `maindata` DESC
    LIMIT 1 
) b ON NULL
WHERE 
a.`idapart`=1 AND a.`idcounterosbb`=4
AND a.`datarec` > LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH 
AND a.`datarec` < DATE_ADD(LAST_DAY(CURDATE()) - INTERVAL 0 MONTH, INTERVAL 1 DAY)
ORDER BY a.`maindata` DESC
LIMIT 1

Но не могу понять что правильно записать в строчку после ON при объединении.


Ответы (1 шт):

Автор решения: Менеджер Типографии

Решение:

SELECT a.`maindata` as maxdata, b.`maindata` as mindata, a.`maindata`-b.`maindata` as delta
    FROM `counterdata` a
    JOIN
    (
        SELECT `maindata`
        FROM `counterdata`
        WHERE 
        `idapart`=1 AND `idcounterosbb`=4
        AND `datarec` > LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 2 MONTH 
        AND `datarec` < DATE_ADD(LAST_DAY(CURDATE()) - INTERVAL 1 MONTH, INTERVAL 1 DAY)
        ORDER BY `maindata` DESC
        LIMIT 1 
    ) b
    WHERE 
    a.`idapart`=1 AND a.`idcounterosbb`=4
    AND a.`datarec` > LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH 
    AND a.`datarec` < DATE_ADD(LAST_DAY(CURDATE()) - INTERVAL 0 MONTH, INTERVAL 1 DAY)
    ORDER BY a.`maindata` DESC
    LIMIT 1
→ Ссылка