Beste tweakers,
n.a.v. mijn vorige topic: [MySQL] Selecteer waar overal aanwezig heb ik toch weer wat vragen. Wat daar besproken is gaat allemaal uit de kunst. Nu het vervolg, de juiste producten aan de hand van de gekozen filters echo'en.
Om te beginnen zal ik wat code "neer gooien":
Voorbeeld van de URL (waarbij enkele filters gekozen zijn):
Database
De database daar hebben we producten_new (3500 items) en producten_specs (130.000 items).
Producten_new met product algemene informatie:
id, leverancier, prijs, productgroep, omschrijving, enz.
Producten_specs met alle specificaties:
id, product_id, cat, name, value
Het probleem / wat moet er gebeuren.
1) Wanneer dit uitgevoerd wordt duurt het gigantisch lang (12 seconden wanneer er één specificatie filter gekozen wordt) voordat er echt wat op het scherm verschijnt. Wilde wat proberen met eerst alle gets op een rijtje zetten om dit later te gebruiken. Om dit juist toe te passen ben ik niet helemaal uit gekomen. Naast dat denk ik achteraf dat dit niet erg in prestatie zal schelen:
2) Wanneer ik bijv. pagina nummering wil toevoegen moet alles in één query (momenteel 2). Of ik moet er een query bij maken. Producten (id's) met algemene filters selecteren, producten (id's) met specificatie filters selecteren en vervolgens een query maken waar deze id's geselecteerd worden en dan pas echo'en. Waarbij we bij de laatste query dus "limit" kunnen toevoegen. Wat is handig?
3) Als er geen specificatie filters geselecteerd zijn maar wel een merk werkt dit momenteel niet. Naast dat als er helemaal geen filters gekozen zijn hebben we ook 0 resultaat. Ook hier heb ik tot op heden nog geen oplossing voor.
Ik hoop dat ik het duidelijk heb uitgelegd en iemand wat advies kan geven.
Wordt mij inmiddels teveel "gerommel" eerst maar eens horen wat voor manier het snel/goed werkt.
Alvast bedankt!
Roy
n.a.v. mijn vorige topic: [MySQL] Selecteer waar overal aanwezig heb ik toch weer wat vragen. Wat daar besproken is gaat allemaal uit de kunst. Nu het vervolg, de juiste producten aan de hand van de gekozen filters echo'en.
Om te beginnen zal ik wat code "neer gooien":
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
| <?php //Algemene filter query opbouwen if($_GET['merk']){ $selecteren .= " AND fabrikant='".secure($_GET['merk'])."'"; } //Timers $timer_start = microtime(true); echo "Start: ".microtime(true)."<br />"; echo "0<br />"; //Producten weergeven $query5 = mysql_query("SELECT id,fabrikant,naam FROM producten_new WHERE icecat_cat='".secure_in($obj->icecat)."'".$selecteren.""); echo '<div class="aanbieding"><p>'; while($row5 = mysql_fetch_assoc($query5)){ //TODO!!! //Als er geen specs filter is gekozen gewoon alle producten weergeven $product_niet_aanwezig = FALSE; //Specs filter query opbouwen foreach($_GET as $key=>$value){ if($product_niet_aanwezig == FALSE){ if($key != "p" AND $key != "id" AND $key != "merk" AND $key != "submit" AND $value != "0"){ $query12 = mysql_query("SELECT COUNT(id) as aantal FROM producten_specs WHERE name='".secure_in(str_replace("_", " ", $key))."' AND value='".secure_in($value)."' AND product_id='".secure_in($row5['id'])."'"); $data12 = mysql_fetch_assoc($query12); //Teller met dubbel L $telller++; if($data12['aantal']){ $product_aanwezig = TRUE; } else { $product_niet_aanwezig = TRUE; $product_aanwezig = FALSE; } } } } if($product_aanwezig){ echo '<a href="index.php?p=product&id='.$row5['id'].'">'.$row5['fabrikant'].' - '.$row5['naam'].'</a><br />'; //Timers echo microtime(true) - $timer_start.'<br />'; $product_aanwezig = FALSE; $producten_weergeven = TRUE; } } if($producten_weergeven == FALSE){ echo 'Geen producten gevonden.'; } //Timers $timer_einde = microtime(true) - $timer_start; echo "Einde: ".$timer_einde.'<br />'; echo 'query12 uitgevoerd: '.$telller; ?> |
Voorbeeld van de URL (waarbij enkele filters gekozen zijn):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| index.php ?p=categorie &id=5 &merk=Asus &Beeldschermdiagonaal=0 &Resolutie=0 &Inclusief+besturingssysteem=0 &Ingebouwde+camera=0 &Chipset=0 &Processor+model=0 &Processor-kloksnelheid=2400+MHz &Processorfamilie=0 &Harde+schijf-interface=0 &Rotatiesnelheid=0 &Totale+opslagcapaciteit=500+GB &Aansluiting+voor+netstroomadapter=0 &VGA+%28D-Sub%29poort%28en%29=0 &Grafische+adapter=0 *knip (anders wordt het overdreven lang)* &submit=Filter+toepassen |
Database
De database daar hebben we producten_new (3500 items) en producten_specs (130.000 items).
Producten_new met product algemene informatie:
id, leverancier, prijs, productgroep, omschrijving, enz.
Producten_specs met alle specificaties:
id, product_id, cat, name, value
Het probleem / wat moet er gebeuren.
1) Wanneer dit uitgevoerd wordt duurt het gigantisch lang (12 seconden wanneer er één specificatie filter gekozen wordt) voordat er echt wat op het scherm verschijnt. Wilde wat proberen met eerst alle gets op een rijtje zetten om dit later te gebruiken. Om dit juist toe te passen ben ik niet helemaal uit gekomen. Naast dat denk ik achteraf dat dit niet erg in prestatie zal schelen:
PHP:
1
2
3
4
5
6
7
8
9
10
| <?php //Specs op een rijtje zetten foreach($_GET as $key=>$value){ if($key != "p" AND $key != "id" AND $key != "merk" AND $key != "submit" AND $value != "0"){ $specs_gets .= $key.",".$value.";"; } } //Laatste ; weg halen $specs_gets = substr($specs_gets, 0, -1); ?> |
2) Wanneer ik bijv. pagina nummering wil toevoegen moet alles in één query (momenteel 2). Of ik moet er een query bij maken. Producten (id's) met algemene filters selecteren, producten (id's) met specificatie filters selecteren en vervolgens een query maken waar deze id's geselecteerd worden en dan pas echo'en. Waarbij we bij de laatste query dus "limit" kunnen toevoegen. Wat is handig?
3) Als er geen specificatie filters geselecteerd zijn maar wel een merk werkt dit momenteel niet. Naast dat als er helemaal geen filters gekozen zijn hebben we ook 0 resultaat. Ook hier heb ik tot op heden nog geen oplossing voor.
Ik hoop dat ik het duidelijk heb uitgelegd en iemand wat advies kan geven.
Wordt mij inmiddels teveel "gerommel" eerst maar eens horen wat voor manier het snel/goed werkt.
Alvast bedankt!
Roy
[ Voor 24% gewijzigd door royduin op 16-03-2011 22:54 ]