Autor Zpráva
perry
Profil *
Potřebuji vybrat následující a předchozí záznam z tabulky. Problém je, že součástí toho musí být řazení.

Mám aktuální ID a potřebují vybrat následující, pokud vím, že datum má být > X a výsledky seřazené podle hodnocení.

Příklad seřazených dat

ID - hodnoceni - datum
2 - 5 - 5
5 - 4 - 5
1 - 4 - 6
3 - 1 - 7

Data pro datum > 4 a seřazeno podle hodnocení. Aktuální ID je 1 a potřebuji vybrat předchozí = 5, následující = 3
Kajman
Profil
Viz. faq.
perry
Profil *
Díky.. a jakým způsobem lze vyřešit cyklení ? Abych, pokud nemám následovníka, vybral záznam z druhé strany výsledků ?
perry
Profil *
Plus se mi nedaří spojit to s JOINem přes druhou tabulku...
jenikkozak
Profil
Jaký dotaz nyní používáte?
Tori
Profil
perry:
Ukažte nefungující dotaz.
Z jaké druhé strany výsledků? Příklad ve FAQ prostě najde následující řádek, pokud v té tabulce nějaký další je - vy jste to ještě navíc omezoval na aktuální stránku?
Honzo, můžete mě klidně smazat, ať se neptáme oba na totéž. Nestihlo se mi zobrazit upozornění, jinak bych to neposílala.
perry
Profil *
Víceméně upravený dotaz z toho FAQ (pro propojení na JOIN):

select a.*
from   tabulka a, tabulka b
left join tabulka2 on tabulka2.datum = b.datum
where  b.id = $id
       and tabulka2.id = 600
       and (a.sloupecek < b.sloupecek or (a.sloupecek = b.sloupecek and a.id < b.id))
order  by a.sloupecek desc, a.id desc
limit  1;

Nicméně ten JOIN prakticky vybírá blbě, výsledky mám jakoby tam nebyl

Co se týče toho cyklení, tak to asi vyřeším druhým dotazem, protože ten případ nastane jen v minimu případů
Tori
Profil
Nemělo by to být spíš takto?

select a.*, tabulka2.*
from   tabulka a, tabulka b
left join tabulka2 on tabulka2.datum = a.datum
where  b.id = $id
       and tabulka2.id = 600
       and (a.sloupecek < b.sloupecek or (a.sloupecek = b.sloupecek and a.id < b.id))
order  by a.sloupecek desc, a.id desc
limit  1;
Z tabulky a čtete předchozí/následující, tab. b je jen referenční.
perry
Profil *
Takhle mi to právě nejde a skončí to chybou:

#1054 - Unknown column 'a.datum' in 'on clause'
Kajman
Profil
perry:
Unknown column 'a.datum' in 'on clause'

Zkuste prohodit aliasy a a b v cross joinu zapsaném čárkou.

Co si ten join dvou tabulek uložit jako view a to použít v odkázaném příkladě?

Pokud neřadíte podle sloupce z tabulky2, můžete ji připojit až na výsledek. Jinak ji také budete muset připojit dvakrát a navíc asi bude potřeba ošetřit null hodnoty, když používáte left join.

Případně, pokud už máte z databáze načtené hodnoty aktuálního záznamu a neznáte jen id, tak ten dotaz může být jednodušší.


Abych, pokud nemám následovníka, vybral záznam z druhé strany výsledků?

V tom případě si uděláte nový jednoduchý dotaz, kde najdete řádek s maximem či minimem (v order by použijte i to id).

select * from tabulka order by hodnoceni, id
select * from tabulka order by hodnoceni desc, id desc

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: