ugrás a tartalomhoz

array_multisort()

todwardus · 2007. Május. 10. (Cs), 10.16
Sziasztok!
Megpróbálok érhető lenni..de így se lesz könnyű megérteni..:) pedig nem bonyolult

Röviden: Van egy táblám, az egyik oszlopban, időpontok vannak (feltöltésük ideje)...és időrend szerint szeretném sorba rakni a sorokat... -eddig egyszerű, ugye? :) -

Találtam: A php.net-en egy oldalt amin a array_multisort függvénnyel pont az én problémámat oldják meg, (nem nagyon értettem)

pontosan ez volt rajta:


"Van egy tömbünk a sorokról, de a array_multisort() oszlopokból álló tömböt vár, ezért a következő kódot használjuk, hogy megkapjuk az oszlopokat, majd elvégezzük a rendezést.
<?php
// Oszlopok előállítása
foreach ($data as $key => $row) {
$volume[$key] = $row['volume'];
$edition[$key] = $row['edition'];
}

// Rendezzük volume szerint csökkenőleg, majd edition szerint növekvőleg.
// A $data tömb az utolsó paraméter, hogy a közös kulcs alapján rendezzen.
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
?> "


Na, most az én lekérdezésem így néz ki (csak a lényeget nézd, nem kell foglalkozni a nem deklarált változókkal..)

$query = "SELECT id, cat, title, uptime
FROM akarmi ";

$pagingQuery = "LIMIT $offset, $rowsPerPage";
$result = mysql_query($query . $pagingQuery);

while(list($id, $name, $address, $age) = mysql_fetch_array($result))
{
echo "blabla".$name."blablaasdfasdf ";
}


Ez így nekem működik, de ugyebár még nem rakja sorba... (az uptime oszlop szerint szeretném rendezni csökkenő sorrendeben) Mivel nem vagyok valami penge a php függvényeg egymásba ágyazásával...
nem tudom, hogy mit kezdjek ezzel a foreach-al hova rakjam? a while elé? -de hogyan? a while-ba az hogy nézne már ki?..vagy esetleg a while után..? - de annak meg mi értelme lenni, hogy megjelenítés után rakja sorba...Meg az is zavar, hogy LIMIT van a lekérdezésben...és nem szeretném, ha az első 50 sort rendezetlenül lekérdezné, majd csak azokat rakná sorba...
(vagy lehet, hogy van erre a célra megfelelőbb függvény csak nem tudok róla)

Kérlek ne csak egy linkkel válaszolj (a legjobb az lenne, ha leírnád a jó kódot)
Köszi

ui.:elnézést mindenkitől, nem akartam ekkora helyet elfoglalni a képernyőn, csak hosszúra sikeredett...
 
1

2 variáció

N0r3i · 2007. Május. 10. (Cs), 11.19
Szia!

2 féle módon is meg tudnám oldani a problémádat:
1. Ahogyan Te szeretnéd: szedd le LIMIT nélkül az összes adatot, de a kiíratás (echo) helyett tedd egy tömbbe az eredményeket, valahogy így:

while($line = mysql_fetch_array($result))
{
$eredmeny[] = $line;
}
majd a $eredmeny tömböt rendeztesd a megtalált kód segitségével, majd írd ki belőle azt a részt, amelyikre épp szükséged van (mint a LIMIT-nél).
Kevésbé hatékony megoldás, hacsak nem tudod a rendezett tömbödet cache-elni valahogy (enélkül minden körben minden adatot le kell húznod az adatbázisból és még rendezni is kell).

2. Használd az ORDER BY sql kifejezést! Együttműködik a LIMIT-tel is, tisztább, szárazabb érzés.

Valakinek jobb ötlete?

Norbi
2

hi

todwardus · 2007. Május. 10. (Cs), 17.19
beleraktam az order by -t de érdekes módon nem is rendezte, de ami még meglepőbb hibaüzenetet se hagyott !Most így néz ki :


Itt van...kicsit összetettebb...Akár benne van az order by akár nincs, UGYAN AZ az eredmény, akár DESC-el akár ASC-el és hibaüzenetet NEM kapok !

$pagingQuery = "";
$result = mysql_query("SELECT id, cat, title, uptime
           FROM table WHERE egyik_oszlop='bbb and masik_oszlop LIKE '%valami%'" 
   ORDER BY 'uptime' DESC       LIMIT 0, 50 ;

while(list($id, $name, $address, $age) = mysql_fetch_array($result))
	echo $id.$age ;
3

Elírás?

N0r3i · 2007. Május. 11. (P), 07.41
Talán csak elírás, de mintha a bbb után hiányozna a bezáró aposztróf, az order by-ban meg az uptime-ot nem szabad aposztrófok közé tenni. Ha az ott visszafelé mutató aposztróf (nem tudom mi a rendes neve), akkor nem szóltam! Ja és az idézőjelekkel sem stimmel valami, vagy csak kapkodtál.

Szóval szerintem így

$result = mysql_query("SELECT id, cat, title, uptime
                       FROM table WHERE egyik_oszlop='bbb' 
                        AND masik_oszlop LIKE '%valami%'
                       ORDER BY uptime DESC
                       LIMIT 0, 50");

while(list($id, $name, $address, $age) = mysql_fetch_array($result))
    echo $id.$age ;
már menni kellene. Persze nem próbáltam ezt konkrétan (kéne hozzá a tábla definíciód is), de általában szokott működni.