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.
- 1953 megtekintés
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...
- A hozzászóláshoz be kell jelentkezni
ugye a halmazelmélet :D
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
jah, van ahol ismerik :)
- A hozzászóláshoz be kell jelentkezni
GROUP BY host_service HAVING MAX(datetime) ?
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
hát ez nem nagyon működik. Lefut, de a GROUP BY az első előfodulásokat pakolja be, és nem a legnagyobb dátumút.
- A hozzászóláshoz be kell jelentkezni
hát most sehol se tudom kiprobalni, de akkor csinald mondjukegy nested query-vel, oda valogasd le a legfrissebbeket es utana azon garazdalkodj.
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
végülis megoldottam. Elég gány, de hirtelen ez jutott eszembe:
Csináltam egy view-t amiben datetime szerint rendeztem a log tábla elemeit és ebből végzem el a legyűjtést és a group by-olást.
Így működik.
- A hozzászóláshoz be kell jelentkezni
az eredeti lekérdezésben s/datetime/max(datetime)/ -t próbáltad? kíváncsi vagyok hogy úgy vajon müxik-e
- A hozzászóláshoz be kell jelentkezni
é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
- A hozzászóláshoz be kell jelentkezni
köszi.
elkezdtem valami ilyesmit is írni, de aztán belegabalyodtam :)
Most egyenlőre hagyom a view-s megoldást. Aztán majd ha több időm lesz átrágom magam ezen is.
- A hozzászóláshoz be kell jelentkezni