tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

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)