[mysql] categorien uit produkten filteren

Pagina: 1
Acties:

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Ik heb een mysql database met 30.000 produkten. Nu is elk produkt onderverdeeld in categorie en subcategorie. Nu bevinden sommige produkten zich in dezelfde subcategorie. Nu zou ik iets van een sitemap willen maken. Zodat alle dubbele categorien eruit worden gehaald. Ik had zelf al het volgende gemaakt:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$i=0;
$j=0;
$sql = "SELECT Category,Sub-Category FROM products";
$result = mysql_query($sql);
while ($row = mysql_fetch_array($result)) {
    $category = $row["Category"];
    $subcategory = $row["Sub-Category"];
    
    if (!in_array($category,$categories[$i])) {
        $categories[$i] = $category;
        if (!in_array($subcategory,$categories[$i][$j])) {
            $categories[$i][$j] = $subcategory;
            $j++;
        }
        $i++;
    } else {
        if (!in_array($subcategory,$categories[$i][$j])) {
            $categories[$i][$j] = $subcategory;
            $j++;
        }
    }
}


Dit gaat alleen niet helemaal goed volgens mij. Omdat die tellers i,j niet helemaal kloppen heb ik het idee.

Ik vraag me dus af hoe ik dit het beste kan doen. Alle produkten staan in 1 tabel. En elk produkt heeft een veld subcategoie en cagtegorie. Hoe kan ik nu een mooie sitemap maken van die database. Zodat alle categporien en subcategorien getoond worden.

[ Voor 34% gewijzigd door RSD op 23-07-2004 14:57 ]


Verwijderd

zou ik niet met php oplossen.
zou met group by of distinct moeten kunnen. ff opzoeken.

-edit-

mm ff gezocht in mijn sql boekje, maar distinct kan maar voor 1 veld.
en group by deed toch niet helemaal wat ik dacht dat het deed.
dus heb geen antwoord voro je.

maar ik kan je wel garandereren dat het via je query op te lossen sneller en mooier is dan via php.

[ Voor 63% gewijzigd door Verwijderd op 23-07-2004 14:44 ]


  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Distinct houdt dat in dat ie alle dubbele etc weglaat? dat zou wel mooi zijn ja, alleen nu nog de daar moeten ook de dubbele uitgehaald worden.

Verwijderd

Even voor de duidelijkheid (en corrigeer me als ik het verkeerd heb):

Je hebt produkten in een orthogonale ruimte van categorieën en subcategorieën (wat wil zeggen dat een subcategorie bij meerdere categorieën kan horen, en andersom).

Nu wil je een lijstje van combinaties van (categorie, subcategorie) die er zijn?

Oftewel:

Categorieën:
Rond, Vierkant, Vreemd

Subcategoriën:
Blauw, Geel, Groen

Uitvoer:
Rond Blauw
Rond Geel
Rond Groen
Vierkant Blauw
Vierkant Geel
Vierkant Groen
Vreemd Blauw
Vreemd Geel
Vreemd Groen

(Gebaseerd op de producten tabel zal dit trouwens alleen combinaties opleveren waar ook daadwerkelijk producten in bestaan).

Klopt?

[ Voor 11% gewijzigd door Verwijderd op 23-07-2004 15:04 ]


  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
klopt..

een rij in de database ziet er dus uit alsvolgt:

prodid - prodnaam - category - subcategory

Nu zou ik graag een lijstje alsvolgt te voorschijn willen halen:

*category1
**subcategory2
**subcategory3
**subcategory4
**subcategory5
*category2
**subcategory2
**subcategory3
**subcategory4
**subcategory5
etc.. zodat ik deze in mijn categorie database kan importeren

[ Voor 58% gewijzigd door RSD op 23-07-2004 15:16 ]


Verwijderd

Ah-hah... ik weet niet of dat in 1 query kan. Ik denk van niet, omdat je daar een boomstructuur probeert aan te brengen vanuit platte gegevens.

De lijst van alle (cat, subcat) tuples vind je gewoon hiermee:

code:
1
SELECT DISTINCT category, subcategory FROM product ORDER BY category ASC


Nu kun je hier met eem PHP loopje doorheen wandelen en deze rijen toevoegen aan de database. Hierbij moet je zorgen dat meerdere dezelfde categories maar 1 keer aangemaakt worden. Dit is al 86 keer behandeld, maar ter referentie hier nog ongeveer zo'n lusje:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ret = mysql_query("SELECT DISTINCT category, subcategory FROM product ORDER BY category ASC");
$lastcat = "";
while ($row = mysql_fetch_row($ret)) {
  if ($row["category"] != $lastcat) {

    /* Hier: voeg de nieuwe category aan de database toe en zorg
        dat $catid de identifier van de zojuist aangemaakte category krijgt
    */

    // $catid = addCategoryToDatabase($row["category"]);
    // ...

    $lastcat = $row["category"];
  }

  /* Hier: voeg de huidige subcategory toe aan de database, en gebruik
      $catid als parent-id.
  */

  // addSubcategoryToDatabase($catid, $row["subcategory"]);
  // ...

}


Mmmmmmmyeahhh... ?

[ Voor 40% gewijzigd door Verwijderd op 23-07-2004 15:30 ]

Pagina: 1