Autor Zpráva
Kajman
Profil *
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
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
to asi ne ....
jogurt
Profil
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:
<?

$id=23;
mysql_connect(___________________);
mysql_select_db(______);
$pred=mysql_fetch_array(mysql_query("SELECT * FROM pokus_s_id WHERE id < ".$id." ORDER BY id DESC LIMIT 1;"));
$mensiid=$pred["id"];
$po=mysql_fetch_array(mysql_query("SELECT * FROM pokus_s_id WHERE id > ".$id." ORDER BY id LIMIT 1;"));
$vetsiid=$po["id"];
?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=iso-8859-2">
<title>pokus</title>
</head>
<body>
mensi: <? echo $mensiid; ?><br>
toto: <? echo $id; ?><br>
vetsi: <? echo $vetsiid; ?>
</body>
</html>


vysledek:
mensi: 8
toto: 23
vetsi: 33
Kajman_
Profil *
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
A co to udělat jedním dotazem:

$sql = "SELECT * FROM tabulka WHERE id IN (".($id-1).", ".($id+1).")";
Kajman_
Profil *
To nefuguje obecně, v id mohou být mezery a až vůbec se to nedá použít pro jiné řazení.
Hugo
Profil
Kajman_

Nojo, když podstrčíš databázi hodnoty, které nekontroluješ. Na to můžeš nepěkně doplatit.
Kajman_
Profil *
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 *
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
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 *
Tak jestli tohle dokážeš napsat pro 4.0, tak maš u mě pivo :-) Já union po order neumím.
Hugo
Profil
Prostě ty dotazy dej do závorek a spoj unionem. To by měla zvládnout i 4 verze.
Kajman_
Profil *
Hugo, máš u mě pivo :-) Ale lepší práce s tím nebude, protože je to na pytel s krajními případy.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0