Infinite sliding window
Sziasztok!
A következő a problémám:
Tegyük fel, hogy a kiválasztott elemünk a 10 és 3 elemnyi a környezet, ekkor a következő értékeket várom:
Ha a kiválasztott elem a 3, akkor a következőket:
Ha a kiválasztott elem a 18, akkor pedig következőket:
A fentit meg lehet valósítani 4 lekérdezéssel.És ebből szerver oldalon fel lehet építeni a kívánt listát.
De gondolom van itt valaki aki jobban ért az adatbázisokhoz, mint én, és meg tudja oldani MySQL alatt egy vagy két akár subquery-t használó lekérdezéssel.
■ A következő a problémám:
- Van egy táblám, elemekkel, amelyek meghatározott időrendben vannak, az egyszerűség kedvéért legyen az oszlop neve id és az értékek pedig egész számok.
- Szeretném lekérdezni a meghatározott elem környezetében levő elemeket egy kis csavarral
- Ha nincs elég elem a kiválasztott előtt, akkor a lista végéről kellene pótolni az elemeket.
- Ha nincs elég elem a kiválasztott után, akkor a lista elejéről kellene pótolni.
id | 1 | 3 | 5 | 7 | 9 | 10 | 12 | 14 | 16 | 18 | 21 | 24 |
---|
Tegyük fel, hogy a kiválasztott elemünk a 10 és 3 elemnyi a környezet, ekkor a következő értékeket várom:
5, 7, 9, *10*, 12, 14 16
.Ha a kiválasztott elem a 3, akkor a következőket:
21, 24, 1, *3*, 5, 7, 9
.Ha a kiválasztott elem a 18, akkor pedig következőket:
12, 14, 16, *18*, 21, 24, 1
. (A *-gal csak azt jelölöm, hogy az a kiválasztott, de a környezetére van csak igazából szükségem).A fentit meg lehet valósítani 4 lekérdezéssel.
SELECT id FROM `test` WHERE id > X ORDER BY id ASC LIMIT 3;
SELECT id FROM `test` WHERE id < X ORDER BY id DESC LIMIT 3;
SELECT id FROM `test` ORDER BY id DESC LIMIT 3;
SELECT id FROM `test` ORDER BY id ASC LIMIT 3;
De gondolom van itt valaki aki jobban ért az adatbázisokhoz, mint én, és meg tudja oldani MySQL alatt egy vagy két akár subquery-t használó lekérdezéssel.
Ha csak a lekérdezések számát…
Nem volt egyszerű
OMG
Nem annyira bonyolult
Két lekéréssel...
Ha csak egy ID kell a
Ez engem is érdekelne...
Viszont Poetrotól még nem láttam, hogy hülyeségeket beszélt volna, ergo kell, hogy legyen valami jó oka.
Terheléselosztás?
Lehet...
Felhő
UNION
-ok tényleg rosszul fognak viselkedni, akkor maradok az alkalmazás oldali felépítésnél, csak spórolni akartam az alkalmazás felépítésén, és inkább az adatbázisra akarnám bízni az adatbányászatot, ha már úgyis arra lett kitalálva.Különben gabesz666 megoldása elég szépen szerepel az
EXPLAIN
szerint, egyedül a UNION táblák, amik zavarnak, és ezek tényleg sokat ronthatnak a teljesítményen, főleg nagyobb adatmennyiség esetén. Főleg, mivel ezek nem cachelhető UNION-ok, gondolom a változók miatt.Természetesen rakok ez elé egy cache réteget, de minden egyes új tartalom esetén sajnos törölni kell majd őket, ezért elég gyakran fog lefutni a lekérdezés az előzetes kalkulációk alapján. Egyébként ez egyfajta lapozó lesz, amivel az előző, illetve következő elemek lesznek kilistázva, már ha nem lett volna egyértelmű.
Ugye majd elmeséled...
(engem legalábbis nagyon érdekelne)
Különösen azok után, hogy...
- kiderült, a filesort nem egészen az, aminek első ránézésre képzeltem (ahogy a neten keresgéltem, nem vagyok vele egyedül :) )
- felfedeztem, hogy míg a "select ... union all select ..." duó filesortot használ, addig a "select * from (select ... union all select ...)" filesort nélkül működik...
+1
4 SELECT
SELECT
-es változatot választottam, mert ott a kezdet és vég jól cachelhető, és ezért szinte csak 2SELECT
-re redukálódik a probléma (valamint a 4SELECT
is valamivel gyorsabb mint aUNION
-os megoldás, és mindenképpen megbízhatóbb). És ez a két SELECT viszont nagyon gyors, és az adatbázismotor is jól tudja cachelni, mivel indexeket használ a rendezéshez és a kiválasztáshoz. De gondolom titeket a kód is érdekel, úgyhogy íme:kicsit más megközelítés
valahonnan biztosan van egy link erre az elemre. az pedig valószínűleg egy listában szerepel.
tehát ha úgy tudsz megérkezni, hogy tudod hányadik (legyen n) az épp megjelenített elem a listában, akkor 'limit n-3,7' aztán ha nem ennek a listának a közepén van amit kerestél, akkor lehet játszadozni..
Nincs