mysql lekérdezés rendezett csoportosítással

Sziasztok a következőre szeretnék megoldást találni:

Adott egy tábla, amelynek egy mezője több adatot is tartalmaz |-al elválasztva. SUBSTRING_INDEX függyvénnyel feldarabolom és AS-al különböző néven kérdezem le őket.
Egyébként nagios log tároló tábláról van szó. Az így feldarabolt adatok: host, service, status, datetime.

Szeretném minden egyes host, minden egyes service-ét lekérdezni, de úgy hogy csak a legújabb datetime-al szereplő jelenjen meg.

Ezt úgy próbáltam megoldani, hogy lekérdezem AS-el a hostot és sevice-t összefűzve és ezt GROUP BY-olom. Ez jó is lenne, de ilyenkor nem a dátum szerinti utolsót pakolja be a lekérdezésbe. Próbáltam ORDER BY-olni a GROUP BY előtt, de ez nem működött. A GROUP BY után pedig, csak a már group by-olt sorokat rendezte.

Szóval erre nem sikerült megoldást talánom.

Íme a lekérdezés jelenleg így néz ki: (ebben csak GROUP BY van, rendezés nincs)
SELECT msg, SUBSTRING_INDEX(SUBSTRING_INDEX(msg, '|', 1),':',-1) as hostnev, SUBSTRING
_INDEX(SUBSTRING_INDEX(msg, '|', 2),':',-1) as host_service, SUBSTRING_INDEX(SUBSTRING_INDEX(msg, '
|', 2),'|',-1) as service, SUBSTRING_INDEX(SUBSTRING_INDEX(msg, '|', 3),'|',-1) as state, SUBSTRING
_INDEX(SUBSTRING_INDEX(msg, '|', 6),'|',-1) as status, datetime FROM nagioslogs WHERE msg LIKE '%SE
RVICE%' GROUP BY host_service

Remélem érthető amit írtam.
Bármilyen öteletet szívesen veszek.

Hozzászólások

próbáld meg a max(datetime) -t lekérdezni a group by esetén.

amúgymeg mysql-ben marhára nem garantált hogy ilyenkor melyik sort veszi be azoknál a mezőknél amelyekre nem vonatkozik group by és aggregation sem. talán oid alapján megy, de nem mernék megesküdni rá. sőt: postgres meg sem eszi az ilyen lekérdezést, pont emiatt...

GROUP BY host_service HAVING MAX(datetime) ?

--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.

én valami ilyet csinálnék

select b.*
from(
SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(msg, '|', 2),':',-1) as host_service,
max(datetime) as datetime
FROM nagioslogs
WHERE msg LIKE '%SERVICE%'
GROUP BY SUBSTRING_INDEX(SUBSTRING_INDEX(msg, '|', 2),':',-1)
) as a
left join(
SELECT
msg,
SUBSTRING_INDEX(SUBSTRING_INDEX(msg, '|', 1),':',-1) as hostnev,
SUBSTRING_INDEX(SUBSTRING_INDEX(msg, '|', 2),':',-1) as host_service,
SUBSTRING_INDEX(SUBSTRING_INDEX(msg, '|', 2),'|',-1) as service,
SUBSTRING_INDEX(SUBSTRING_INDEX(msg, '|', 3),'|',-1) as state,
SUBSTRING_INDEX(SUBSTRING_INDEX(msg, '|', 6),'|',-1) as status,
datetime
FROM nagioslogs
WHERE msg LIKE '%SERVICE%'
GROUP BY host_service
)as b
on a.host_service = b.host_service and
a.datetime = b.datetime