[PHP/MySql] meerdere records > 1 record met behoud van data

Pagina: 1
Acties:
  • 180 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik zit hier met een wat lastige kwestie en heb even jullie hulp nodig :P

Ik ben bezig aan een modelletje voor een mysql-database en ben alvast aan het bedenken hoe ik 1 en ander met php ga scripten en hoe ik de data uit de database ga halen. Ik heb een tabel met producten waarin de specificaties voorkomen. Nu is het zo dat een bepaald product geleverd kan worden met verschillende opties en deze producten staan dan dus meerdere keren in de tabel (tenminste, dat is mijn opzet).

Nu komt het probleem; ik wil op een pagina de specificaties van een bepaald model opvragen. Als dit model meerdere keren in de tabel voorkomt, met unieke combinaties voor alle opties/specificaties, dan kan ik 2 dingen doen:
- het model heel vaak afdrukken met de specificaties (er zijn soms veel opties dus veel mogelijkheden en dus kan dit een onoverzichtelijke boel worden)
- het model eenmalig afdrukken/weergeven en dan op plekken waar meerdere opties zijn dit aangeven
Nu wil ik graag het tweede doen, even een voorbeeld voor de duidelijkheid:

model: model
breedte: 20cm/30cm/40cm
hoogte: 10cm

enz, in de tabel zijn dit dus dan 3 records (elk met een andere breedte). Nu kom ik er alleen niet uit hoe ik dit in mysql kan realiseren, en met php kom ik er wel uit maar wordt het wat ingewikkeld. De verschillende opties die ik kon verzinnen:
- een aparte tabel waarin de breedte is opgenomen en dan gebruik maken van JOINS; lost het probleem niet zo op want ik heb ten eerste behoorlijk wat kolommen met specificaties die verschillen dus dat worden heel wat kleinere tabellen en ten tweede zal ik in PHP moeten gaan samenvoegen
- gewoon 1 tabel en dan samenvoegen in PHP, lijkt me niet handig want dan moet ik steeds weer een ander record inlezen en dan gaan vergelijken etc etc (lijkt me niet snel en onlogisch)
- gewoon een SELECT uitvoeren voor elke specificatie, dat zijn dus hele kleine query's die wellicht snel zijn uit te voeren (weet ik eigenlijk wel zeker) maar het zijn er wel veel; bij veel pageviews worden dat dus al erg veel kleine query's en dat lijkt me qua performance niet echt super
- dan de laatste mogelijkheid die ik kon verzinnen maar ik weet niet of het kan ( :+ ); ik dacht, zoals de topictitel ook al aangaf, misschien heeft MySQL een functie ingebouwd zodat ik alle records kan samenvoegen, waarbij de data gescheiden wordt door komma's of een ander teken. Eigenlijk dus hetzelfde als GROUP BY, maar dan op alle kolommen en met behoud van de data. Ik hoop dat duidelijk is wat ik bedoel.

Heeft iemand misschien nog een ander idee, had ik al een goed idee maar ben ik er onterecht 'ontevreden' over of kan iemand mij helpen met het laatste (heb het niet kunnen vinden maar je weet maar nooit) :)

Acties:
  • 0 Henk 'm!

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 17:49

ripexx

bibs

Als ik heel simpel kijk, zonder verder naar bijzonderheden te kijken, dan zie ik producten, waarbij een product een of meerdere modellen/types heeft. Elk type heeft dan weer eigen kenmerken/specificaties.

De tabellen
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PRODUCT
productid (PK)
naam
enz

MODEL
modelid (PK)
productid (FK)
model
enz

MODEL_SPEC
modelid (FK)
specid (FK)
waarde

SPEC
specid (PK)
omschrijving


Om van een bepaald model de gegevens op te halen is niet zo heel moeilijk.
SQL:
1
2
3
4
5
6
SELECT product.naam, model.omschrijving, spec.omschrijving, model_spec.waarde
FROM product, model, model_spec, spec
WHERE product.productid = model.product.id
    AND model.modelid = model_spec.modelid
    AND model_spec.specid = spec.specid
    AND model.modelid = 123;

De output zal afhanklijk van de hoeveelheid specs het volgende zijn
code:
1
2
3
TV   Breedbeeld   Breedte   72
TV   Breedbeeld   Hoogte    50
TV   Breedbeeld   Diepte    45

De weergave is nu iets wat je in je applicatie zal moeten afvangen. In ieder geval als je het met een query wil oplossen.

Als je nu uit gaat van producten, zal je eenzelfde resultaat behalen, alleen dan meer records. vedre kan je dit natuurlijk uitbreiden met model groepen, proiductgroepen, leveranciers, producenten, kenmerken/spec groepen enz enz. Het is maar net hoeveel details je wil gebruiken.
Verwijderd schreef op maandag 22 augustus 2005 @ 21:59:
Ik zit hier met een wat lastige kwestie en heb even jullie hulp nodig :P

Ik ben bezig aan een modelletje voor een mysql-database en ben alvast aan het bedenken hoe ik 1 en ander met php ga scripten en hoe ik de data uit de database ga halen. Ik heb een tabel met producten waarin de specificaties voorkomen. Nu is het zo dat een bepaald product geleverd kan worden met verschillende opties en deze producten staan dan dus meerdere keren in de tabel (tenminste, dat is mijn opzet).
Zie hierboven, hoe ziet jouw tabel structuur er dan uit?
Nu komt het probleem; ik wil op een pagina de specificaties van een bepaald model opvragen. Als dit model meerdere keren in de tabel voorkomt, met unieke combinaties voor alle opties/specificaties, dan kan ik 2 dingen doen:
- het model heel vaak afdrukken met de specificaties (er zijn soms veel opties dus veel mogelijkheden en dus kan dit een onoverzichtelijke boel worden)
Layout is niet iets wat je database moet doen, dat doet je applicatie.
- het model eenmalig afdrukken/weergeven en dan op plekken waar meerdere opties zijn dit aangeven
Nu wil ik graag het tweede doen, even een voorbeeld voor de duidelijkheid:

model: model
breedte: 20cm/30cm/40cm
hoogte: 10cm

enz, in de tabel zijn dit dus dan 3 records (elk met een andere breedte). Nu kom ik er alleen niet uit hoe ik dit in mysql kan realiseren, en met php kom ik er wel uit maar wordt het wat ingewikkeld. De verschillende opties die ik kon verzinnen:
- een aparte tabel waarin de breedte is opgenomen en dan gebruik maken van JOINS; lost het probleem niet zo op want ik heb ten eerste behoorlijk wat kolommen met specificaties die verschillen dus dat worden heel wat kleinere tabellen en ten tweede zal ik in PHP moeten gaan samenvoegen
Niet doen want je systeem en applicatie zij zo niet meer beheersbaar. Imers als je in eens ook andere kenemrken wil vast leggen met je weer al je queries en code aanpassen. Voor een goede opzet dus niet echt wenselijk.
- gewoon 1 tabel en dan samenvoegen in PHP, lijkt me niet handig want dan moet ik steeds weer een ander record inlezen en dan gaan vergelijken etc etc (lijkt me niet snel en onlogisch)
a. waarom zou dit niet snel zijn
b. een tabel is een no go. Zie normalisatie regels
- gewoon een SELECT uitvoeren voor elke specificatie, dat zijn dus hele kleine query's die wellicht snel zijn uit te voeren (weet ik eigenlijk wel zeker) maar het zijn er wel veel; bij veel pageviews worden dat dus al erg veel kleine query's en dat lijkt me qua performance niet echt super
- dan de laatste mogelijkheid die ik kon verzinnen maar ik weet niet of het kan ( :+ ); ik dacht, zoals de topictitel ook al aangaf, misschien heeft MySQL een functie ingebouwd zodat ik alle records kan samenvoegen, waarbij de data gescheiden wordt door komma's of een ander teken. Eigenlijk dus hetzelfde als GROUP BY, maar dan op alle kolommen en met behoud van de data. Ik hoop dat duidelijk is wat ik bedoel.
Volgens mij haal je CONCAT en GROUP BY uit elkaar. CONCAT gebruik je om text strings samen te voegen. GROUP BY gebruik je bij het querien op de database. Zie ook de SQL FAQ.
Heeft iemand misschien nog een ander idee, had ik al een goed idee maar ben ik er onterecht 'ontevreden' over of kan iemand mij helpen met het laatste (heb het niet kunnen vinden maar je weet maar nooit) :)
Zoals gezegd teken je model eens uit, dan kunnen we denk ik veel beter commentaar geven.

buit is binnen sukkel


Acties:
  • 0 Henk 'm!

  • ShadowLord
  • Registratie: Juli 2000
  • Laatst online: 18-09 22:12
Als het soort en aantal opties variabel is zou ik het als volgt doen:

Maak een tabel met de productgegevens.
Maak een tabel met opties.
Link deze aan elkaar.

Als volgt dus:
tabel - producten
int id PRIMARY AUTO_INCREMENT
varchar naam
int hoogte

tabel - opties
int id PRIMARY AUTO_INCREMENT
int product (dit is dus een id uit de product tabel)
varchar naam
varchar beschrijving

PHP:
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
$pquery = mysql_query("SELECT id, naam, hoogte FROM producten");
while ($row = mysql_fetch_assoc($pquery)) // Loop door producten heen
{
  print("Product: ".$row["naam"]."<br />\n");
  print("Hoogte: ".$row["hoogte"]."<br />\n");
  $oquery = mysql_query("SELECT naam, beschrijving FROM opties WHERE product = ".$row["id"]." GROUP BY optienaam");
  $curopt = "";
  while ($optie = mysql_fetch_assoc($oquery)) // Loop door opties bij product heen
  {
    if ($optie["naam"] != $curopt) // Nieuwe optie?
    {
      if ($curopt != "") // Nieuwe regel, maar alleen als er al vorige waren
      {
        print("<br />\n");
      }
      print($row["naam"].": ")
      $comma = false;
    }
    if ($comma)
    {
      print(", ");
    }
    else
    {
      $comma = true;
    }
    print($row["beschrijving"]);
  }
  if ($curopt != "") // Check of er opties geprint zijn
  {
    print("<br />\n"); // Sluit laatste optie regel af
  }
  print("<br />\n"); // Lege regel tussen producten
}

[ Voor 33% gewijzigd door ShadowLord op 22-08-2005 23:02 ]

You see things; and you say, "Why?" But I dream things that never were; and I say, "Why not?"


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Allereerst bedankt voor de uitgebreide reply's :)

Ik zal eerst even aangeven hoe ik het model zelf had opgebouwd (ik neem even als voorbeeld een auto):

PRODUCTEN
id
model
kleur
metaillic
lichtmetalenvelgen
elekramen
adviesprijs

KLEUR
id (=producten.kleur)
kleur

Op die manier was ik het dus van plan, alle specificaties/opties in de tabel producten duwen, en alleen voor kolommen waar veel waarden mogelijk zijn (dus niet alleen ja of nee maar bijvoorbeeld veel kleuren) een aparte tabel aanmaken en deze zo linken.
Op die manier zullen er in de tabel producten dus ca 40 (?) specificaties direct zijn opgenomen, in de vorm ja, nee of mogelijk (bijv 0,1,2). Volgensmij is het niet zo slim en netjes om dit allemaal in 1 tabel te duwen, maar aan de andere kant vond ik het ook idioot om voor elk kolom een aparte tabel te gaan maken. Nu ik het idee van ripexx zie, lijkt me dit inderdaad een goede oplossing die er bovendien voor zorgt dat je gemakkelijk een specificatie kan toevoegen. Dan moet ik alleen nog even zien uit te zoeken hoe ik dit ga afdrukken met php.

@ShadowLord: misschien dat jij hetzelfde bedoelde maar kwam er niet helemaal uit

Ik was nog vergeten te zeggen dat het overigens mogelijk is om 2 specificaties 'naast elkaar te leggen'. Omdat het bovendien gaat om vrij veel specificaties leek mij een tabel nuttig voor dit maar dat kan ik blijkbaar beter anders doen :? Probleem dat ik heb bij het afdrukken van een tabel is dat ik regel voor regel moet afdrukken, en daarom dus eigenlijk 2 specificaties door elkaar moet afdrukken (eerst spec1 van beide, daarna spec2 van beide enz). Kan ik beide specificaties beter in 1 query stoppen en deze op de juiste manier sorteren of kan ik beter 2 query's uitvoeren en de records in een andere var opslaan? Een laatste vraag is dan nog of de query's niet enorm traag worden door al die gelinkte tabellen?

Ik kom nu tegen een klein probleempje aan met het model van ripexx. Omdat elk model verschillende specificaties heeft, kan een model ook verschillende prijzen hebben. Ik moet dus nu voor 1 model, alsnog meerdere modelid's hebben om een prijs aan een modelid te kunnen koppelen. Maar volgensmij is hier geen andere oplossing voor :)

[ Voor 9% gewijzigd door Verwijderd op 23-08-2005 11:36 ]