Avatar billede tangveje Nybegynder
10. januar 2003 - 21:51 Der er 9 kommentarer og
1 løsning

Kategori funktion

Hej, jeg har en tabel i mysql med følgende felter

id, subid, category

'category' er navnet på kategorien (og sikkert stavet forkert :), og 'subid' er hvilken id den kategori hører under. Hvis jeg nu propper 3 kategorier i tabellen således

id    subid    category
----  -------  -----------
1    0        Danmark
2    1        Sjælland
3    2        København

Så er Danmark en overordnet kategori (hører ikke under nogen andre). Under Danmark er sjælland, og under sjælland er så københavn. Håber i kan følge med så vidt :)

Nu er mit problem så, at jeg mangler en funktion som kan tage f.eks kategorien "København", køre ned igennem kategorierne og returnere dette

Danmark -> Sjælland -> København

Den kan jeg desværre ikke lige regne ud, og håber derfor nogen her ved hvordan det gøres bedst.

På forhånd tak :)
Avatar billede tipsen Nybegynder
10. januar 2003 - 22:05 #1
Med mindre du har brug for et variabelt antal kategori-niveauer, synes jeg du bør splitte dataene op i 3 tabeller, som linkes sammen via et id.

Tabel1: (overordnet kategori)
id for posten
kategoribeskrivelse

Tabel2:("mellem"-ordnet kategori)
id for posten
linkid til overordnet kategori
kategoribeskrivelse

Tabel3: (underkategori)
id for posten
linkid til mellemordnet kategori
kategoribeskrivelse

Med den opbygning vil det være nemt at pille data ud fra tabellerne ved at linke dem sammen i forespørgslen!
Avatar billede tangveje Nybegynder
10. januar 2003 - 22:14 #2
Desværre skal der være mulighed for et variabelt antal niveauer, jeg kan ikke vide på forhånd om der er 1, 2, 3 eller 20 niveauer (selvom 20 nok er usandsynligt)
Avatar billede tipsen Nybegynder
10. januar 2003 - 22:21 #3
OK - så får du sandsynligvis brug for et variabelt antal sql-sætninger - der er sikkert en smart løsning, men jeg har den desværre ikke.
Avatar billede jakoba Nybegynder
10. januar 2003 - 22:59 #4
dit felt subid fortæller hvilken kategori er 'forelder', så det vil jeg lige kalde den:

id    forelder  category
----  --------  ---------
1      0          Danmark
2      1          Sjælland
3      2          København

$sql_kommando = "
    SELECT fff.category as bessefar, ff.category as far, f.category as denne
    FROM  dintabel as f, dintabel as ff, dintabel as fff
    WHERE f.category = 'københavn'
      AND ff.id = f.forelder
      AND fff.id = ff.forelder
";
$result = mysql_query( $sql_kommando ) or die( mysql_error() );
extract( mysql_fetch_array( $result ) );
echo "$bessefar --> $far --> $denne<br>";

mvh JakobA
Avatar billede jakoba Nybegynder
10. januar 2003 - 23:01 #5
men jeg er forresten enig med tipsen. den metode kræver at du VED der er 3 niveauer til toppen. Hvis det ikke altid er sandt går det galt.
Avatar billede tangveje Nybegynder
10. januar 2003 - 23:06 #6
Hmm... Kom til at tænke på hvordan det er gjort her på eksperten... Hvis man klikker på "opret spørgsmål" får man jo kategorierne listet på samme måde som jeg ønsker at gøre.
Avatar billede jakoba Nybegynder
11. januar 2003 - 01:44 #7
Men hvis man tænker sig om er det nu ikke så svært.
een stor tabel som du lægger op til og de 2 funktioner nedenfor

function hent_foran( $id ) {
    $res = mysql_query( "
        SELECT *
        FROM dintabel
        WHERE id = '$id'
    " ) or die( mysql_error() );
    $row = mysql_fetch_array( $res );
    if ( $row['subid'] > 0 ) {
        return  hent_foran( $row['subid'] ) ." --> " .$row['category'];
    } else {
        return  $row['category'];
    }
}

function hent_alt( $kategori ) {
    $res = mysql_query( "
        SELECT *
        FROM dintabel
        WHERE category = '$category'
    " ) or die( mysql_error() );
    $row = mysql_fetch_array( $res );
    if ( $row['subid'] > 0 ) {
        return  hent_foran( $row['subid'] ) ." --> " .$row['category'];
    } else {
        return  $row['category'];
    }
}

// du kalder så altid funktionen hent_alt

echo hent_alt( "københavn" ) ."<br>";

mvh JakobA
Avatar billede tangveje Nybegynder
11. januar 2003 - 02:04 #8
Jep, det ser jo ud til at virke :) Men der er en lille ting der generer mig en smule, hvis jeg har f.eks. 2 overordnede kategorier med hver 2 underordnede så bliver resultatet sådan her

Danmark
Sverige
Danmark -> København
Danmark -> Odense
Sverige -> Skåne
Sverige -> Stockholm

Jeg ville dog helst have det på denne måde

Danmark
Danmark -> København
Danmark -> Odense
Sverige
Sverige -> Skåne
Sverige -> Stockholm

Hvis det er praktisk muligt altså :) Udover dine 2 funktioner har jeg denne kode, og har forsøgt mig lidt frem med det, men kan ikke lige gennemskue den detalje.

$query = mysql_query( "SELECT id, category FROM categories ORDER BY subid, category ASC" ) ;

while ( $data = mysql_fetch_assoc( $query ) ) {
  if ( $kit == $data['id'] ) {
    echo '<option value="' . $data['id'] . '" selected="selected">' . hent_alt( $data['category'] ) . '</option>' ;
  } else {
    echo '<option value="' . $data['id'] . '">' . hent_alt( $data['category'] ) . '</option>' ;
  }
}
Avatar billede jakoba Nybegynder
11. januar 2003 - 02:53 #9
det er din "ORDER BY subid, ..." der sørdger for at de linier blot en hovedkategori kommer forrest, de har jo subid = 0.

en mulighed løsning ville være at tilføje et ekstra felt i tabellen sådan at alle categorier der nedstammer fra danmark har 0 i det felt, alle der nedstammer fra sverige har 1 i feltet osv

d    subid    gruppe  category
----  -------  -------  -----------
1      0        0        Danmark
2      1        0        Sjælland
3      2        0        København
4      0        1        Sverige
5      1        1        Skåne
6      2        1        Stockholm

og så tage feltet gruppe med i din ORDER BY:

$query = mysql_query( "SELECT id, category FROM categories ORDER BY gruppe, subid, category ASC" ) ;

mvh JakobA
Avatar billede tangveje Nybegynder
11. januar 2003 - 03:10 #10
Takker mange gange :) Lader til jeg har en tendens til at kaste mig over kryptiske projekter for tiden, men så det jo godt at der er hjælp at hente :)
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