Autor | Zpráva | ||
---|---|---|---|
Kajman Profil * |
#1 · Zasláno: 6. 11. 2005, 17:23:43
Zajímalo by mě, zda náhodou někdo neumíte v MySql 4.0 nějak ladně vyřešit tohle... mám id z tabulky a chci získat id těsně před tím mým a těsně po tom mém id na seřazené tabulkce.
Jde to samozřejmě udělat tak, že si vytvořím novou temporary tabulku, kde si přídám nějaké autoincrement a data budou seřazená. Zjistím pořadí mého id a udělám select na id s pořadí o jedno větším a menším. Ale snad to jde líp :-( Ani nemůžu najít, jestli MySQL má něco jako rownum. No šlo by to taky tak, že bych si udělal select na pořadí a pak druhý s limitem na tři řádky kolem mého... ale když mezi těmi dvoumi někdo stihne něco přidat, tak by to nemuselo souhlasit. Nemáte někdo ideu jak na to? |
||
jogurt Profil |
#2 · Zasláno: 7. 11. 2005, 17:44:51
nezkousel sem to, ale myslim, ze by se to dalo udelat takhle:
mensi id: SELECT * FROM tabulka WHERE id < $id ORDER BY id DESC LIMIT 1; vetsi id: SELECT * FROM tabulka WHERE id > $id ORDER BY id LIMIT 1; napis, jestli to bude fungovat... |
||
23k Profil |
#3 · Zasláno: 7. 11. 2005, 18:09:38
to asi ne ....
|
||
jogurt Profil |
#4 · Zasláno: 7. 11. 2005, 18:39:09 · Upravil/a: jogurt
23k
tak jsem to vyzkousel a docela to funguje: tabulka pokus_s_id: Upravit Smazat 1 fcff Upravit Smazat 3 gsrergre Upravit Smazat 5 esrvtrhvr Upravit Smazat 7 tttrete Upravit Smazat 8 sff Upravit Smazat 23 uuuuuuuuuuu Upravit Smazat 33 efwefwe Upravit Smazat 36 dbdd kod: <? vysledek: mensi: 8 toto: 23 vetsi: 33 |
||
Kajman_ Profil * |
#5 · Zasláno: 7. 11. 2005, 19:41:47
Jogurte, dík. Tušil jsem, že to půjde nějak jednoduše :-)
Jen přidám pro zájemce ukázku při řazení podle jiného sloupečku: --levnější select a.* from auta a, auta b where b.idau=$id and (a.cena<b.cena or (a.cena=b.cena and a.idau<b.idau)) order by a.cena DESC, a.idau DESC limit 1; --dražší select a.* from auta a, auta b where b.idau=$id and (a.cena>b.cena or (a.cena=b.cena and a.idau<b.idau)) order by a.cena, a.idau DESC limit 1; |
||
Hugo Profil |
#6 · Zasláno: 7. 11. 2005, 20:06:04
A co to udělat jedním dotazem:
$sql = "SELECT * FROM tabulka WHERE id IN (".($id-1).", ".($id+1).")"; |
||
Kajman_ Profil * |
#7 · Zasláno: 7. 11. 2005, 20:10:32
To nefuguje obecně, v id mohou být mezery a až vůbec se to nedá použít pro jiné řazení.
|
||
Hugo Profil |
#8 · Zasláno: 7. 11. 2005, 20:17:01
Kajman_
Nojo, když podstrčíš databázi hodnoty, které nekontroluješ. Na to můžeš nepěkně doplatit. |
||
Kajman_ Profil * |
#9 · Zasláno: 7. 11. 2005, 20:23:46
Nemyslel jsem mezery v $id ale v id v tabulce... jako že tam už není řádek, který tam kdysi byl nebo neodpovídá případným dalším podmínkám ve where :-)
$id je už samozřejmě oštřené |
||
Kajman_ Profil * |
#10 · Zasláno: 7. 11. 2005, 20:27:58
Jo a to dražší je špatně je potřeba otočit všechny podmínky i na to idau přidané jen pro jednoznačnost...
--dražší select a.* from auta a, auta b where b.idau=$id and (a.cena>b.cena or (a.cena=b.cena and a.idau>b.idau)) order by a.cena, a.idau limit 1; |
||
Hugo Profil |
#11 · Zasláno: 7. 11. 2005, 20:30:53
Kajman_
Aha, tak v tom případě bych to pospojoval pomocí UNION, ušetříš jeden dotaz a IMHO se ti s tím bude pracovat pohodlněji. |
||
Kajman_ Profil * |
#12 · Zasláno: 7. 11. 2005, 20:33:34
Tak jestli tohle dokážeš napsat pro 4.0, tak maš u mě pivo :-) Já union po order neumím.
|
||
Hugo Profil |
#13 · Zasláno: 7. 11. 2005, 20:38:56
Prostě ty dotazy dej do závorek a spoj unionem. To by měla zvládnout i 4 verze.
|
||
Kajman_ Profil * |
#14 · Zasláno: 7. 11. 2005, 20:47:43
Hugo, máš u mě pivo :-) Ale lepší práce s tím nebude, protože je to na pytel s krajními případy.
|
||
Časová prodleva: 19 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0