Oznámení
Select řádku nad a pod dotazem
před 10 lety
- dotTwelve
- Člen | 172
Muzete mi nekdo poradit jak vybrat radek pod a nad ID vysledku? s tim, ze je potreba aby to na ID zavisle nebylo, jelikoz se muze zmenit (vymaze se clanek a tak).
před 10 lety
- phx
- Člen | 652
Napada me na 3 dotazy. Nebo jeden se 3 castmi.
Dle neceho radis (vzestupne) a dle neceho vybyras (ID = x) onen prostredni radek.
- Ten nad tim vezmes jako ID < x a radis sestupne a beres LIMIT 1.
- Ten pod tim vezmes jako ID > x a radis vzestupne a beres LIMIT 1.
I kdyz asi by slo spojit onen radek s tim 1 pod jako ID >= x a LIMIT 2.
Dalsi reseni me napada jako:
- zjistis 1. zaznam nad pozadovanym
- vezmes od toho „nad“ LIMIT 3
Takze to posledni asi takto:
SELECT * FROM table WHERE id = (SELECT id FROM table WHERE id < x ORDER BY id DESC LIMIT 1) ORDER BY id LIMIT 3
před 10 lety
- kravčo
- Člen | 723
dotTwelve napsal(a):
Muzete mi nekdo poradit jak vybrat radek pod a nad ID vysledku? s tim, ze je potreba aby to na ID zavisle nebylo, jelikoz se muze zmenit (vymaze se clanek a tak).
Ako to súvisí s dibi?
phx napsal(a):
Takze to posledni asi takto:
SELECT * FROM table WHERE id = (SELECT id FROM table WHERE id < x ORDER BY id DESC LIMIT 1) ORDER BY id LIMIT 3
Zrejme preklep:
SELECT * FROM table WHERE id >= (SELECT id FROM table WHERE id < x ORDER BY id DESC LIMIT 1) ORDER BY id LIMIT 3
Tento kód funguje super, pokiaľ si nevyžiadam prvý záznam (teda taký, od ktorého predošlý neexistuje). Vtedy to vráti prázdny výsledok – 0 riadkov.
Podarilo sa mi napísať lepší, dokonca sa dá aj meniť, koľko predošlých/nasledujúcich sa má zobraziť (čo v tomto prípade nejde). Najprv mi napadol presne rovnaký postup, no keď som našiel jeho problém, bolo po srande…
SELECT t1.*, COUNT(t2.id) AS "count"
FROM `table` AS t1
LEFT JOIN `table` AS t2 ON t1.id > t2.id
GROUP BY t1.id
HAVING ABS((SELECT COUNT(*) FROM `table` WHERE id < %id%) - "count") <= %abs%
Podmienkou samozrejme je, aby %id%
v databáze existovalo, inak
to (pri oboch spôsoboch) vráti zlé dáta.
(pre %abs%
= 1 to vráti jeden predošlý a dva nasledujúce –
keďže %id%
neexistuje)
Editoval kravčo (20. 8. 2009 18:15)