Mám tabulku :
obrazek_v_galerii: gallery_id (primární klíč), img_id (primární klíč), ...
Potřebuju pomocí SELECT vybrat následující obrázek, který spadá zároveň do určité galerie. Prostě nejbližší následující img_id, které má žádané gallery_id.
Něco jako:
SELECT img_id FROM obrazek_v_galerii WHERE (img_id > $_GET[img_id]) AND (gallery_id = $_GET[gallery_id]) LIMIT 1"
Tohle ale nefunguje. Jak na to správně?
nefunguje - jako že to vyplivne jinej záznam nebo to hodí chybu? Pokud to dává jinej záznam, tak imho proto, že ti to dá první větší kterej najde, což nemusí bejt nejbližší. Zkusila bych tam doplnit ORDER BY img_id ASC, tím by se první nejmenší, splňující podmínku, měl dostat na začátek, a mohlo by to dopadnout
hledal jsem nejblizsi predchozi a nejblizsi nasledujici zaznam v db o fotkach a nakonec jsem to vymyslel takhle:
<?php
// pri uploadu fotky se v db vytvori zaznam a fotka dostane jmeno podle id toho
// zaznamu. Tzn. ke kazdemu zaznamu existuje prave jedna fotka, jejiz soubor
// se da podle zaznamu identifikovat.
// vytvori pole $seznam, ktery bude mit nasledujici tvar:
// -- $seznam[id_fotky]['pred'] = id predchazejici fotky
// -- $seznam[id_fotky]['pote'] = id nasledujici fotky
// Pokud predchozi/nasledujici zaznam neexistuje, hodnota je NULL.
// dotaz, ktery vrati vsechny zaznamy (jejich id) o fotkach v urcene galerii (podle galerie_id).
// Tento vysledek vlastne tvori "seznam", podle ktereho se musi dohledat 'pred' a 'pote'.
$res_seznam = mysql_query("SELECT id FROM fotky WHERE galerie_id='$galerie_id'");;
$seznam = Array();
$i = 0;
while ($row = mysql_fetch_array($res_seznam, MYSQL_NUM))
{
$seznam1[$i][0]=$row[0];
($i>0) ? ($seznam1[$i-1][1]['pote']=$row[0]) : false ;
$seznam1[$i+1][1]['pred']=$row[0];
$i++;
}
array_pop($seznam1);
foreach($seznam1 as $val)
(!isset($val[1]['pred'])) ?
($seznam[$val[0]] = Array( 'pred' => null, 'pote' => $val[1]['pote'])) :
((!isset($val[1]['pote'])) ?
($seznam[$val[0]] = Array( 'pred' => $val[1]['pred'], 'pote' => null)) :
($seznam[$val[0]] = Array( 'pred' => $val[1]['pred'], 'pote' => $val[1]['pote'])));
// Nevyhoda tohoto reseni je ta, ze pri kazdem pouziti vytvari cele pole, ze ktereho pouzije pouze jednu polozku.
?>
Ale ano cyklem se to řešit dá, já to dělám takhle:
//$_GET[gid] obsahuje id aktuální galerie
//$_GET['iid'] obsahuje id aktuálního obrázku
$result = MySQL_Query("SELECT img_id FROM table WHERE gallery_id = $_GET[gid] ORDER BY img_id");
while($item = MySQL_Fetch_Array($result, MYSQL_BOTH)) {
if ($item['pid'] < $_GET['iid']){
$prev = $item['pid'];
}
if ($item['pid'] > $_GET['iid']) {
$next = $item['pid'];
break;
}
}
Problém je ten, že to není elegantní. To by mělo jít čistě jen SQL dotazem.
Pardon - OPRAVA:
// $_GET[gid] - obsahuje id aktuální galerie
// $_GET['iid'] - obsahuje id aktuálního obrázku
// img_id - id obrázku v tabulce
// gallery_id - id galerie v tabulce
$result = MySQL_Query("SELECT img_id FROM table WHERE gallery_id = $_GET[gid] ORDER BY img_id");
while($item = MySQL_Fetch_Array($result, MYSQL_BOTH)) {
if ($item['img_id'] < $_GET['iid']){
$prev = $item['img_id'];
}
if ($item['img_id'] > $_GET['iid']) {
$next = $item['img_id'];
break;
}
}
"Potřebuju pomocí SELECT vybrat následující obrázek, který spadá zároveň do určité galerie. Prostě nejbližší následující img_id, které má žádané gallery_id."
SELECT img_id
FROM obrazek_v_galerii
WHERE (
img_id > $_GET[img_id]
)
AND (
gallery_id = $_GET[img_id]
)
ORDER BY img_id
LIMIT 1
Díky moc zbi už to chodí i tim dotazem. Mě tam chybělo to "ORDER BY img_id" proto mi to nešlo.
nezbyva mi, nez si dat facku a muj "genialni" skript, nad kterym jsem stravil pad desitek minut, odlozit na dno galerie "nekdy mozna uzitecnych" skriptu. A misto vytvareni dvou obrovskych poli napsat dva jednoduche a strucne SQL dotazy, dokonce staci jen jeden...
nač dělat věci jednoduše, když to jde složitě?
:D