Avatar billede hoppe11 Nybegynder
19. december 2007 - 19:24 Der er 9 kommentarer og
1 løsning

php funktion i query

jeg har en table med lande og tidszoner.. jeg vil så sortere landene efter offset i tidszonen som kræver en PHP funktion

hvordan er det muligt at gøre dette?

mit svar på det ville være, men her trækker den stadig rækkerne ud efter rækkefølgen i selve tablen i db'en

$arr = array();
$get = mysql_query("SELECT id, timezone FROM $DB._ref_timezone");
while($row = mysql_fetch_assoc($get)) $arr[$row['id']] = timezone_offset($row['timezone']);

asort($arr);
echo implode(',', array_keys($arr));

$get = mysql_query("SELECT * FROM $DB._ref_timezone WHERE id IN(".implode(',', array_keys($arr)).")");
while($row = mysql_fetch_assoc($get))
{
// kode
}
Avatar billede arne_v Ekspert
20. december 2007 - 02:33 #1
skal du ikke bare have en ORDER BY på det der skal sorteres efter ?
Avatar billede hoppe11 Nybegynder
20. december 2007 - 15:09 #2
jo, men det felt jeg skal sortere efter skal først igennem en php funktion.. det er der mit problem ligger

feltet kunne f.eks. hedde "Europe/Copenhagen" som så i min php funktion bliver til 3600
Avatar billede hoppe11 Nybegynder
20. december 2007 - 15:11 #3
jeg kan heller ikke bare sætte mit felt på 3600 da det varierer alt efter om det er sommertid :)
Avatar billede pidgeot Nybegynder
20. december 2007 - 15:24 #4
Jeg vil foreslå du laver en callback-funktion der sammenligner og dermed kan bruge uasort() til sorteringen.

Traditionelt set sorterer man dog ud fra den "normale" tidsforskel (hvis vi har meget generelle tidszoner, eks. som Windows' indstillinger), eller alfabetisk (hvis vi har Europe/Copenhagen, Europe/Berlin, etc).
Avatar billede arne_v Ekspert
21. december 2007 - 04:03 #5
MySQL kan ikke kalde PHP.

Kan du ikke lave en tabel i databasen med de offsets og så bare joine den ind
og sortere helt normalt ?
Avatar billede hoppe11 Nybegynder
21. december 2007 - 10:06 #6
pidgeot > jeg er ikke helt med? :)

arne > Jeg troede så bare man kunne gøre noget lign. som i mit indledende eksempel med f.eks "id IN(arr)"

men jo, jeg må vel bare lave et felt med offsets
Avatar billede pidgeot Nybegynder
21. december 2007 - 10:42 #7
I PHP er der en funktion der hedder usort (skrev forkert før - der er også en uasort, men vi kan lige så godt bruge usort). Den kunne du bruge til at sortere selve rækkerne, så du ikke skal hente dem ud flere gange (hvilket alligevel ville kræve individuelle queries eller en ultra-lang query med UNIONs).

Med andre ord:

function tzcomparefunc($a,$b) {
  if (timezone_offset($a['timezone']) == timezone_offset($b['timezone'])) {
    return 0;
  }
  return (timezone_offset($a['timezone']) < timezone_offset($b['timezone'])) ? -1 : 1;
}

$get = mysql_query("SELECT id, timezone FROM $DB._ref_timezone");
while($row = mysql_fetch_assoc($get))
  $arr[] = $row;

usort($arr,'tzcomparefunc');
foreach($arr as $tzrow)
{
  //kode
}
Avatar billede hoppe11 Nybegynder
23. december 2007 - 12:48 #8
smart :)

smid et svar pidgeot
Avatar billede pidgeot Nybegynder
23. december 2007 - 12:51 #9
Værsgo.

Igen, normalt ville man have et fast offset i tabellen eller sortere efter navn - men det kan godt lade sig gøre.
Avatar billede hoppe11 Nybegynder
23. december 2007 - 14:40 #10
jeg vil gerne være besværlig :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester