Avatar billede mp82 Nybegynder
03. marts 2003 - 17:09 Der er 11 kommentarer og
2 løsninger

Sortering

Hej

Jeg skal have sorteret, så den sortere på hvor mange der er i mellem fx. 6 og 11 (der er jo 5), og der hvor der er færrest i mellem skal stå øverst og så skal de komme derned ad.

Her er et eksempel på hvordan tal'ne kan se ud, jeg hiver dem ud af den db hvor de ligger i hvert sit felt (dog hører 6 og 11 sammen, ligesom 4 og 8, og 4 og 10 også hører sammen).

Før sortering:
6  og 11
4  og  8
4  og 10

Efter sortering skal de komme til at stå sådan:
4  og  8
6  og 11
4  og 10


Håber nogen kan hjælpe lidt :)
Avatar billede swaxi Nybegynder
03. marts 2003 - 17:33 #1
utestet ...
<?php
function cmp ($a, $b) { 
    $d_a = $a[0]-$a[1];    if ($d_a<0) $d_a=$d_a*-1;
    $d_b = $b[0]-$b[1];    if ($d_b<0) $d_b=$d_b*-1;
   
    if ($d_a == $d_b) return 0;
    return ($d_a > $d_b) ? -1 : 1;
}

$a = array (array(6,11), array(4,8), array(4,10));
echo "<pre>";
echo "før sort\n";
var_dump($a);
usort ($a, "cmp");
echo "efter sort\n";
var_dump($a);
echo "</pre>";
?>
Avatar billede mp82 Nybegynder
03. marts 2003 - 17:51 #2
Det ser ud til at du har fat i noget af det rigtige. Det er godt nok den modsatte vej den sortere - men den sortere da (den starter med 4-10, så 6-11 og 4-8) - MEN jeg skal have den ind i en mysql_query(SELECT bla bla FROM blabla ORDER BY [det her array] -  er det muligt?
Avatar billede swaxi Nybegynder
03. marts 2003 - 18:12 #3
modsat vej kan du få ved at ændre :
    return ($d_a > $d_b) ? -1 : 1;
til
    return ($d_a < $d_b) ? -1 : 1;

jeg forstår ikke helt dit mysql-select. du kan jo trække dine data ud fra db uden noget ORDER BY ... og så bare køre dit array igennem ovenstående funktion.

eg :
$result = mysql_query("SELECT a,b FROM blabla");
$a = array();
while ($row=mysql_fetch_array($result)) {
    array_push($a,array($row['a'],$row['b']));
}
echo "<pre>";
echo "før sort\n";
var_dump($a);
usort ($a, "cmp");
echo "efter sort\n";
var_dump($a);
echo "</pre>";
Avatar billede mp82 Nybegynder
03. marts 2003 - 18:25 #4
Hmm... oki, grunden til at jeg ville lave det som en ORDER BY, var fordi den samttidig skal trække en masse flere data med ud, som jeg skal bruge - men det burde den jo kunne gøre alligevel..


Men hvordan skal det så skrives - har testet lidt, men får bare 0 ud.
Hvor skal:
function cmp ($a, $b) { 
    $d_a = $a[0]-$a[1];    if ($d_a<0) $d_a=$d_a*-1;
    $d_b = $b[0]-$b[1];    if ($d_b<0) $d_b=$d_b*-1;
   
    if ($d_a == $d_b) return 0;
    return ($d_a > $d_b) ? -1 : 1;
}

sættes ind henne i denne her sammenhæng?
Avatar billede swaxi Nybegynder
03. marts 2003 - 18:52 #5
<?php
define ('KEY_A','a');
define ('KEY_B','b');
function cmp ($a, $b) { 
    $d_a = $a[KEY_A]-$a[KEY_B];    if ($d_a<0) $d_a=$d_a*-1;
    $d_b = $b[KEY_A]-$b[KEY_B];    if ($d_b<0) $d_b=$d_b*-1;
   
    if ($d_a == $d_b) return 0;
    return ($d_a < $d_b) ? -1 : 1;
}

$result = mysql_query("SELECT ".KEY_A.",".KEY_B.",foo,bar,frugtkage,find,selv,paa,flere FROM blabla");
$a = array();
while ($row=mysql_fetch_array($result)) {
    $a2 = array();
    foreach ($row as $key => $value)
        $a2[$key] = $value;
    array_push($a,$a2);
}
echo "<pre>";
echo "før sort\n";
var_dump($a);
usort ($a, "cmp");
echo "efter sort\n";
var_dump($a);
echo "</pre>";
?>
Avatar billede jpvj Nybegynder
03. marts 2003 - 19:05 #6
Det kan vist gøres lidt pænere i ren SQL - i en linie faktisk:

Her et eksempel fra SQL2000:

create table voting.dbo.test
(a int,
b int,
c VARCHAR(10))

INSERT INTO voting.dbo.test VALUES (1,10,'æbler')
INSERT INTO voting.dbo.test VALUES (5,2,'pærer')
INSERT INTO voting.dbo.test VALUES (6,5,'gulerødder')

SELECT * FROM voting.dbo.test ORDER BY ABS(a-b)

Bemærk ABS(a-b) der giver forskellen som positivt heltal. Du kan evt. fjerne ABS() hvis ikke det er det du ønsker.

Returnerer:
6 5 gulerødder
5 2 pærer
1 10 æbler

JP
Avatar billede mp82 Nybegynder
03. marts 2003 - 19:16 #7
swaxi > Jeg kan godt se princippet i det, men jeg forstår bare ikke "KEY_A" & "KEY_B" - Hvordan gør jeg med dem?

En hjælp er måske, at de felter i db'en som jeg skal trække nummer ud fra hedder: "hold_plus_maal" og "hold_minus_maal"...
Avatar billede jpvj Nybegynder
03. marts 2003 - 19:24 #8
Hvis du skal bruge differencen til noget ex. udskrift kan du gøre således:

SELECT * FROM tabel hold_plus_maal, hold_minus_maal, hold_plus_maal- hold_minus_maal as maal_diff, field4, field5, ORDER BY maal_diff

Så har du differencen direkte fra SQL kaldet som feltet maal_diff.

Hvis ikke du skal bruge det til noget så kan du skrive

SELECT * FROM tabel hold_plus_maal, hold_minus_maal, field4, field5, ORDER BY (hold_plus_maal-hold_minus_maal)

Hvis hold_minus_maal er negativt skal værdierne nok lægges til, men det er en helt anden snak.

JP
Avatar billede jpvj Nybegynder
03. marts 2003 - 19:25 #9
Argh! Der var lige et komma for meget i SELECT:


SELECT * FROM tabel hold_plus_maal, hold_minus_maal, hold_plus_maal- hold_minus_maal as maal_diff, field4, field5 ORDER BY maal_diff

Så har du differencen direkte fra SQL kaldet som feltet maal_diff.

Hvis ikke du skal bruge det til noget så kan du skrive

SELECT * FROM tabel hold_plus_maal, hold_minus_maal, field4, field5 ORDER BY (hold_plus_maal-hold_minus_maal)
Avatar billede mp82 Nybegynder
03. marts 2003 - 19:27 #10
jpvj > Jeg tester lige lidt, prøver med den først (ABS funktionen) den ser ud til at løse meget af det...
Avatar billede swaxi Nybegynder
04. marts 2003 - 00:34 #11
define ('KEY_A','hold_plus_maal');
define ('KEY_B','hold_minus_maal');

... men jpvj's løsning er smartere
Avatar billede mp82 Nybegynder
04. marts 2003 - 08:08 #12
swaxi > jpvj's løsning fylder i hvertfald noget mindre, så jeg har valgt at bruge den.
Men jeg synes også du skal have noget for dit arbejde, så jeg vil give jer 30 point hver (håber i synes det er en ok fordeling?).
Avatar billede jpvj Nybegynder
04. marts 2003 - 18:20 #13
Helt fint med mig :-)
En argument for at lave det direkte i SQL er, at DBMS (DataBase Management Systemet) selv optimerer kaldet. Desuden er fortoklet PHP kode ikke særligt hurtigt. Derfor mit forslag.

JP
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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