[mysql] in categorieën opgedeeld data uit db halen

Pagina: 1
Acties:
  • 50 views sinds 30-01-2008

  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
Ik heb me suf gezocht naar een oplossing voor mijn probleem.

Ik heb een database vol met aanbiedingen, aan iedere aanbieding zit een categorie_id. Die categorie id is nuttig voor het bepalen van de categorie waaronder de aanbieding valt. [categorien zijn meestal 4 diep]

dit is de tabel van de categorien:
code:
1
2
3
4
5
6
7
CREATE TABLE cat (
id int(10) NOT NULL auto_increment,   //cat_id die in aanbieding tabel staat.
iid int(10) NOT NULL auto_increment, //aanbieding id
cat_pos int(10) NOT NULL default '',   //positie van nesten 
cat varchar(55) NOT NULL default '',  // de naam van de categorie
PRIMARY KEY  (id)
) TYPE=MyISAM;


Ik had in het verleden altijd de categorien zelf in de tabel van de aanbiedingen staan maar dat kan nu niet meer, indertijd werkte het met de +- volgende code:

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
<? 
include("lowscripts/functions/print_body.php");
include("lowscripts/functions/image_print_offers/preload_images.php");
include("lowscripts/functions/image_print_offers/create_thumbnail.php");

$query_1 = dbExQuery("SELECT DISTINCT(cat) FROM cat WHERE cat_pos = '0'");

while($result_1 = dbFetchObject($query_1)) 
{
    print $result_1->cat . "<br />";
    $query_2 = dbExQuery("SELECT DISTINCT(cat) FROM aanbieding");

    while($result_2 = dbFetchObject($query_2)) 
    {
        $query_3 = dbExQuery("SELECT product FROM aanbieding WHERE sub_cat = '$result_2->sub_cat' AND cat = '$result_1->cat' ORDER BY product ASC");
        print "&nbsp;&nbsp;&nbsp;&nbsp;" . $result_2->sub_cat . "<br />";
        
        while($result_3 = dbFetchObject($query_3)) 
        { 
            print "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" . $result_3->product . "<br />";
        }
    }
}
?>


Het eigenlijke probleem is het volgende:: een aanbieding kan voorkomen in meerdere categorieën, dus ik kan niet een loopje maken en dan alles uitzetten, want dan zou hij de aanbieding bij 1 van de categorien weglaten.

Weet iemand hoe ik mijn queries moet opbouwen om dit voor elkaar te krijgen, keb de hele dag al lopen prutsen en nu heb ik koppijn 8)7

Vraag maar raak en ik geef info... 8)

[ Voor 8% gewijzigd door wboard op 15-10-2004 15:52 ]

A smooth sea never made a skilled sailor


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 19-05 13:45

gorgi_19

Kruimeltjes zijn weer op :9

En wat wil je nu precies :) Beschrijf eens in woorden wat die query moet doen, want dat maak ik niet op uit je verhaal.

[ Voor 64% gewijzigd door gorgi_19 op 15-10-2004 15:56 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
Ja ok :)

De output moet worden:
code:
1
2
3
4
5
6
7
8
9
10
11
[title cat_1 cat_pos0]
  [title cat_1 cat_pos1]
    [title cat_1 cat_pos2]
      [title product aanbieding id 1]
      [title product aanbieding id 2]
      [title product aanbieding id 3]
  [title cat_2 cat_pos1]
  [title cat_3 cat_pos1]
    [title cat_1 cat_pos2]
      [title product aanbieding id 1]
[title cat_2 cat_pos0]


zoals je ziet moet ik op een pagina alle aanbiedingen opbouwen, en zo dat de gebruiker klikt op een categorie en dat dmv een verborgen div openklapt, totdat hij bij zijn aanbieding is. De aanbieding en cat tabel moeten dus aangeroepen worden om te bepalen waar de aanbieding komt, onder welke kolom. Maar het probleem is dat 1 aanbieding onder meerdere categorien voor kan komen..

Het werkte perfect, totdat ik 1 aanbieding onder meerdere kopjes moest gaan laten zien...

Wat zou het handigst zijn qua query om dit te realiseren. En moet ik meerdere loops gebruiken?? Ik heb dus zoals ik al zei teveel geprobeert... (niet genoeg.. :r )

Ik hoop dat het nu wat duidelijker is. anders hoor ik het wel :)

A smooth sea never made a skilled sailor


  • vinnux
  • Registratie: Maart 2001
  • Niet online
Een extra koppel tabel tussen categorie en product.

Het is tevens mogelijk om alles met één query te doen ipv loops van queries.
Het voordeel hiervan is dat het sneller wordt bij het opvragen, maar langzamer en complexer als je gaat inserten in de boom.
Je kunt in de koppeltabel bij houden het nummer in de huidige categorie (leaf walk) of in de hele boom (tree walk) afhankelijk van de mogelijke soorteringen.

[ Voor 81% gewijzigd door vinnux op 15-10-2004 17:01 ]


  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
jaja... dus met een extra tabelletje die aangeeft in welke categorie hij voorkomt:
maar hoe doe ik het dan met het nesten van de categorieën, wel met mijn tabel?
Want dan denk ik dat dat bijna niet kan in 1 query... 8)7

A smooth sea never made a skilled sailor


  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
GEIL! :9~ het werkt, alleen is mijn vraag of ik het wel op de meest efficiënte manier doe, want hiervoor werd gezegd dat het in 1 query kon, wat mij niet echt reëel leek. (Ik moet de DIV ook nog afsluiten met </div>, dat vormt het probleem volgens mij)

Maar ik heb dus tabel met aanbiedingen
en tabel met categorie wat er zo uitziet
code:
1
2
3
4
5
6
7
8
9
10
11
id  int(10)   
iid  int(10)  
cat_pos  int(10)   
cat  varchar(55)   
cat_ref  int(10) 

Inhoud:
1 94 0 makelaarsreclame 1 
2 94 1 nieuwe_producten 1 
3 94 0 reclame 3 
4 94 1 blaaattt 3


Ik heb nu een product aanbieding met het id 94, die zo ingedeeld moet worden
code:
1
2
3
4
5
6
makelaarsreclame
    nieuwe_producten
        94
reclame
    blaaattt
        94


de categorien moeten geprint worden en afgesloten, dit is het script wat het opbouwt en wat werkt.
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
<? 
$query_1 = dbExQuery("SELECT * FROM cat WHERE cat_pos = '0' GROUP BY cat ORDER BY cat ASC");

while($result_1 = dbFetchObject($query_1)) 
{
    //<div>
                print $result_1->cat . "<br />";
    $query_2 = dbExQuery("SELECT * FROM cat WHERE cat_pos = '1' AND cat_ref = '$result_1->id' GROUP BY cat ORDER BY cat ASC");
    
    while($result_2 = dbFetchObject($query_2)) 
    {
        //<div>
        $query_3 = dbExQuery("SELECT product FROM aanbieding_cat INNER JOIN cat ON aanbieding_cat.id = cat.iid WHERE cat_pos = '$result_2->cat_pos' AND cat = '$result_2->cat' AND cat_ref = '$result_1->cat_ref' ORDER BY product DESC");

        print "&nbsp;&nbsp;&nbsp;&nbsp;" . $result_2->cat . "<br />";
        
        while($result_3 = dbFetchObject($query_3)) 
        { 
            print "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" . $result_3->product . "<br />";
        }
        //</div>
    }
    //</div>
}
print mysql_error();
?>


mijn vraag is kan dit efficienter?? (ja ik weet het ik ben aan het zijken)..

[ Voor 13% gewijzigd door wboard op 29-10-2004 12:06 ]

A smooth sea never made a skilled sailor


  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
Nu het volgende probleem weer [het werkt dus nog niet helemaal correct]:

ik heb
code:
1
$query_1 = dbExQuery("SELECT * FROM cat WHERE cat_pos = '0' GROUP BY cat ORDER BY cat ASC");


In database staat: bv. 10x de categorie blaat, met daar aan 10x een id (van aanbieding).

Hij returnt hier deze categorie maar 1x, das logisch en goed, maar ik moet WEL van IEDERE rij het unieke ID terugkrijgen, hoe kan ik dat goed doen in 1 query... ik heb nu al 3 queries en dat vindt ik wel genoeg. :)

suggestie: moet ik het filteren (dat hij maar 1x geprint wordt) van de categorie met php doen ? or what?

[ Voor 19% gewijzigd door wboard op 29-10-2004 15:07 ]

A smooth sea never made a skilled sailor


  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
vgouw schreef op 15 oktober 2004 @ 16:58:
Een extra koppel tabel tussen categorie en product.

Het is tevens mogelijk om alles met één query te doen ipv loops van queries.
Het voordeel hiervan is dat het sneller wordt bij het opvragen, maar langzamer en complexer als je gaat inserten in de boom.
Je kunt in de koppeltabel bij houden het nummer in de huidige categorie (leaf walk) of in de hele boom (tree walk) afhankelijk van de mogelijke soorteringen.
Geen flauw idee hoe je dat dan voor elkaar krijgt?! Geef eens een voorbeeldje

A smooth sea never made a skilled sailor


  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
Het werkt! nu eindelijk goed
onderstaand de code:
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
<? 
$query_1 = dbExQuery("SELECT * FROM cat WHERE parent_id = '1' ORDER BY cat ASC"); 

while($result_1 = dbFetchObject($query_1)) 
{
    print $result_1->cat . "<br />";
    $query_2 = dbExQuery("SELECT * FROM cat WHERE parent_id = '$result_1->id' ORDER BY cat ASC");

    while($result_2 = dbFetchObject($query_2)) 
    {
        $query_3 = dbExQuery("SELECT * FROM aanbieding_cat INNER JOIN cat_map ON aanbieding_cat.id = cat_map.iid WHERE cat_map.cid = '$result_2->id'");

        print "&nbsp;&nbsp;&nbsp;&nbsp;" . $result_2->cat . "<br />";
        
        while($result_3 = dbFetchObject($query_3)) 
        { 
            print "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" . $result_3->object . "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" . $result_3->id . "<br />";
        }
    }
}
/*
CREATE TABLE cat (
  id int(10) NOT NULL auto_increment,
  parent_id int(10) NOT NULL default '0',
  cat varchar(225) NOT NULL default '0',
  cat_des varchar(255) NOT NULL default '',
  PRIMARY KEY  (id)
) TYPE=MyISAM;


CREATE TABLE cat_map ( 
    id int(10) NOT NULL auto_increment,
    cid SMALLINT NOT NULL REFERENCES cat(id), 
    iid SMALLINT NOT NULL REFERENCES aanbieding_cat(id), 
    PRIMARY KEY (id) 
) TYPE=MyISAM;
*/
?>


Nog een hele andere vraag: Hoe kan ik voorkomen dat een verborgen div pas geladen wordt als hij opengeklapt wordt??

A smooth sea never made a skilled sailor


  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
ben ik de enige hier ofzo? :?

Nog een hele andere vraag: Hoe kan ik voorkomen dat een verborgen div pas geladen wordt als hij opengeklapt wordt??

A smooth sea never made a skilled sailor


  • Thijsmans
  • Registratie: Juli 2001
  • Laatst online: 16:37

Thijsmans

⭐⭐⭐⭐⭐ (5/5)

wboard schreef op 11 november 2004 @ 13:45:
ben ik de enige hier ofzo? :?
Sorry, was even vergeten dat we hier aleen zijn om jou te helpen |:(
Nog een hele andere vraag: Hoe kan ik voorkomen dat een verborgen div pas geladen wordt als hij opengeklapt wordt??
Ik neem aan dat je het over plaatjes hebt, gezien tekst geen tijd neemt om in te laden? Dan moet je ze met javascript inladen:

JavaScript:
1
2
img = new Image();
img.src = 'pad/naar/plaatje.jpg';


Dan laadt javascript ze alvast in de tmp-files. Kan uiteraard ook met een array:

JavaScript:
1
2
3
4
5
6
7
images = new Array('1.jpg', '2.gif', '3.psd');

for(i=0; i<images.length; i++)
{
    img = new Image();
    img.src = images[ i ];
}


Andere fancy preloaders kun je hier vast wel vinden


Edit: ik bedenk me net ineens dat images een preserved word is (ivm document.images), dus daar moet je een andere naam voor nemen :)

[ Voor 11% gewijzigd door Thijsmans op 11-11-2004 13:51 ]

Privacy-adepten vinden op AVGtekst.nl de Nederlandse AVG-tekst voorzien van uitspraken en besluiten.


  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
ok dan! tnx, ik ga me er eens in verdiepen. _/-\o_

A smooth sea never made a skilled sailor


  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
maar met een preloader zorg je ervoor dat de afbeeldingen van te voren worden opgebouwd, ik wil het zo hebben dat wanneer iemand een DIV opent dat hij dan pas de afbeeldingen laad.
of is dat minder efficiënt??

de categorieën klappen dus open, totdat hij alle producten laat zien incl. afbeeldingen, als ik al die afbeeldingen ga preloaden is dat zonde van de datastroom, want iemand die op de betreffende site komt opent toch nooit alle categorieën om alle producten te bekijken.
Hij laad nu dus alles bij voorbaat al, ik wil het zo hebben dat hij pas gaat laden als de betreffende categorie (of div) geopend wordt!

ik kan daar alleen nog weinig over vinden, iemand suggesties?????? :)

A smooth sea never made a skilled sailor


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 19-05 13:45

gorgi_19

Kruimeltjes zijn weer op :9

wboard schreef op donderdag 23 december 2004 @ 16:18:
ik kan daar alleen nog weinig over vinden, iemand suggesties?????? :)
Ik gok dat je hier weinig suggesties zal gaan krijgen, aangezien clientside zaken in Webdesign & Graphics thuishoren.

Ik zie weinig heil om dit topic te moven naar Webdesign & Graphics, aangezien dan verschillende discussies door elkaar gaan lopen. Je kan daar een nieuw topic openen.

Digitaal onderwijsmateriaal, leermateriaal voor hbo

Pagina: 1

Dit topic is gesloten.