MySQL Group по полю на основе максимального значения другого поля IN THE GROUP (нет в таблице) - PullRequest
3 голосов
/ 11 марта 2011

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


un_id   avl_id  avl_date    avl_status
1738    6377398 2011-03-10  unavailable 
1738    6377399 2011-03-11  unavailable 
1738    6377400 2011-03-12  unavailable 
1738    6719067 2011-03-12  unavailable
1738    6719351 2011-03-12  available
1738    6377401 2011-03-13  unavailable 
1738    6377402 2011-03-14  unavailable 
1738    6377403 2011-03-15  unavailable 
1738    6377404 2011-03-16  available
1738    6719068 2011-03-16  unavailable 
1738    6719352 2011-03-16  available

Который получается из следующего запроса:

<code>
SELECT 
    tbl_unit.un_id,
    tbl_availability.avl_id,
    tbl_availability.avl_date, 
    tbl_availability.avl_status
FROM
    tbl_unit
INNER JOIN 
    tbl_availability ON 
    tbl_unit.un_id = tbl_availability.un_id
WHERE
    tbl_availability.avl_active='True' AND
    tbl_unit.un_active='True' AND
    tbl_availability.avl_date >= '2011-03-10' AND
    tbl_availability.avl_date 

Я хочу, чтобы GROUP BY un_id, чтобы отображался только avl_status с самым высоким avl_id. то есть:

un_id   avl_id  avl_date    avl_status
1738    6377398 2011-03-10  unavailable 
1738    6377399 2011-03-11  unavailable 
1738    6719351 2011-03-12  available
1738    6377401 2011-03-13  booked 
1738    6377402 2011-03-14  booked 
1738    6377403 2011-03-15  booked 
1738    6719352 2011-03-16  available
</code>

Я пытался добавить предложения GROUP BY и HAVING и различные подзапросы, но каждый раз мне не удавалось ....

Вся помощь приветствуется! :) - Адам.

Ответы [ 2 ]

0 голосов
/ 11 марта 2011

Попробуйте это:

SELECT
     un_id,avl_status
    FROM
    ( 
    SELECT 
        tbl_unit.un_id,
        tbl_availability.avl_id,
        tbl_availability.avl_date, 
        tbl_availability.avl_status
    FROM
        tbl_unit
    INNER JOIN 
        tbl_availability ON 
        tbl_unit.un_id = tbl_availability.un_id
    WHERE
        tbl_availability.avl_active='True' AND
        tbl_unit.un_active='True' AND
        tbl_availability.avl_date >= '2011-03-10' AND
        tbl_availability.avl_date 
    )
    GROUP BY 
     un_id,avl_status
    HAVING
     avl_id=max(avl_id) 
0 голосов
/ 11 марта 2011
SELECT 
    tbl_unit.un_id,
    tbl_availability.avl_id,
    tbl_availability.avl_date, 
    tbl_availability.avl_status
FROM
    tbl_unit
INNER JOIN 
    (select un_id, max(avl_id) as max_avl_id from tbl_availability group by un_id) T
    on tbl_unit.un_id = T.un_id
INNER JOIN tbl_availability ON 
    T.max_avl_id = tbl_availability.avl_id
WHERE
    tbl_availability.avl_active='True' AND
    tbl_unit.un_active='True' AND
    tbl_availability.avl_date >= '2011-03-10' AND
    tbl_availability.avl_date
...