[Mysql/Sql] Kolommen en rijen combineren

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

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Hallo iedereen,

Vraagje ik heb twee tabellen in een mysql database staan waar ik gegevens uit zou willen halen. Alleen hetgeen ik niet snap is hoe de query moet.

Tabel 1 :
code:
1
2
3
4
5
Artnr
kenmerknr1
kenmerknr2
kenmerknr3
kenmerknr4

Voorbeeld record :
code:
1
2
Artnr           kenmerknr1 kenmerknr2 kenmerknr3 kenmerknr4
1001           1                  2                  19


Tabel 2 :
code:
1
2
Kenmerknr
Omschrijving

Voorbeeld records :
code:
1
2
3
4
Kenmerknr   omschrijving
1                   Grolsch
2                   Bier
19                 Krat


Nu wil ik dus met een query het artnr en alle drie de kenmerken laten zien, hoe doe ik dit...

Geprobeerd :
code:
1
2
3
4
5
6
7
8
9
10
Select tabel1.artnr,
           tabel2.omschrijving as omschrijving1,
           tabel2.omschrijving as omschrijving2,
           tabel2.omschrijving as omschrijving3,
           tabel2.omschrijving as omschrijving4
from tabel1,tabel2
where (tabel1.kenmerknr1 = omschrijving1) and
           (tabel1.kenmerknr2 = omschrijving2) and
           (tabel1.kenmerknr3 = omschrijving3) and
           (tabel1.kenmerknr4 = omschrijving4)


Maar dit geeft geen enkel resultaat ( niet alle kenmerken in tabel 1 hoeven / zijn gevuld )

Het gaat hier over mysql 3.23.49 en dit moet ook in een produktie omgeving met deze mysql versie gaan draaien dus subquery's helpen mij niet.

De request komt vanuit PHP dus hier kan ik nog wel iets mee doen, maar het gaat om 18.000 records die ik in een lijst wil laten zien dus ik kan niet per artnr 4x de omschrijving ophalen.

  • BrZ
  • Registratie: Maart 2000
  • Laatst online: 27-05 08:35

BrZ

afgezien van het feit dat het een brak database model is, zou het op deze manier moeten werken:

code:
1
2
3
4
5
6
7
8
9
10
SELECT tabel1.artnr,
           t21.omschrijving AS omschrijving1,
           t22.omschrijving AS omschrijving2,
           t23.omschrijving AS omschrijving3,
           t24.omschrijving AS omschrijving4
FROM tabel1, tabel2 t21, tabel2 t22, tabel2 t23, tabel2 t24
WHERE (tabel1.kenmerknr1 = t21.kenmerknr) AND
           (tabel1.kenmerknr2 = t22.kenmerknr) AND
           (tabel1.kenmerknr3 =t23.kenmerknr) AND
           (tabel1.kenmerknr4 = t24.kenmerknr)


Maar ik zou serieus gaan denken over een andere database opzet ;)

edit:

Nu werkt het alleen als alle 4 de kenmerken zijn ingevuld, op dat op te lossen moet je met LEFT JOINS aan de slag, maar dat mag je zelf uitzoeken ;))

[ Voor 18% gewijzigd door BrZ op 22-01-2004 21:30 ]


  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 08:34
Herschrijf de query eens met 4 joins. Dat zou toch echt moeten werken.

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Tabel opzet is niet mijn idee, is een bestaand erp systeem waar ik een crm gedeelte aan vast probeer te plakken. Lukte tot nu toe wel aardig, maar liep hierbij dus even tegen probleempje aan.

Het database model is niet brak voor het erp pakket, want dan zoek je voornamelijk op losse kenmerken en omgekeerd (van kenmerk naar artikel) werkt het wel goed. Alleen ik ben dus weer eigenwijs en wil weer iets anders.

Maar je query werkt perfect, beetje langzaam maar dan maar ff een paar indexjes aanmaken.

Btw. Met left joins werkt niet zo lekker op deze dbase. Is daar iets te groot/traag voor, maar een null waarde toevoegen aan tabel2 deed ook wonderen.

[ Voor 14% gewijzigd door Gomez12 op 22-01-2004 21:40 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
SQL is een taal waarmee je gegevens uit een DB haalt, het is niet de bedoeling dat SQL ze ook in de gewenste vorm eruithaalt.
Het verzorgen van de layout doe je dus best door je client, en laat je niet door SQL afhandelen.

En je datamodel is idd brak. Lees even iets over normaliseren.

[ Voor 11% gewijzigd door whoami op 22-01-2004 21:53 ]

https://fgheysels.github.io/


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Whoami : Ging niet zozeer over de vorm, maar meer dat ik alle gegevens eruit wilde halen die ik moest hebben. En ik vind het heel leuk dat jij iets over normaliseren wilt vertellen, maar met een bestaand en al 3 jaar draaiend pakket waar je een webinterface / informatie systeempje aan wilt toevoegen is het iets moeilijker/bijna onmogelijk om te gaan normaliseren. Want dan moet je het bestaande invoerpakket ook gaan veranderen en dat is iets waar nou net geen behoefte aan is.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Je zult dan -zoals jvmeer al zegt- met 4 joins moeten werken:

code:
1
2
3
4
5
select artikel.id, kenmerk1.omschrijving, kenmerk2.omschr, kenmerk3.omschr, kenmerk4.omschr
from artikel, kenmerken kenmerk1, kenmerken kenmerk2, kenmerken kenmerk3, kenmerken kenmerk4
LEFT JOIN artikel.omschr1 = kenmerk1.id
LEFT JOIN artikel.omschr2 = kenmerk2.id
....


Qua performance is dit natuurlijk niet zo fijn, maar ik zou niet weten hoe je 't anders met 1 query kunt doen.

Ik moet toch eerst leren lezen alvorens te blaten. :+
Gomez12 schreef op 22 januari 2004 @ 21:39:

Btw. Met left joins werkt niet zo lekker op deze dbase. Is daar iets te groot/traag voor, maar een null waarde toevoegen aan tabel2 deed ook wonderen.
Bedoel je nu dat je een record gemaakt hebt, met een kenmerknr (dat hopelijk een primary key is) NULL? Maw, heb je een NULL value in een PK - veld gepropt?

[ Voor 50% gewijzigd door whoami op 22-01-2004 22:13 ]

https://fgheysels.github.io/


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Whoami : Nee kenmerknr is geen PK, tabellen zijn een stuk groter, maar ik had weinig zin 40 kolommen van een tabel te beschrijven als ik er maar 2 gebruik. Alleen heb ik nu wel een index op kenmerknr gegooid. Zoals ik al zei is het een bestaand / draaiend systeem en heeft nogal wat tabellen met nogal wat kolommen. Maar vraag ging alleen even over dit puntje.

Mijn eigen query is ook nog een stuk uitgebreider ( op dit moment 15 velden ophalen en 30 where regels inc. 3 joins ), maar het idee heb ik toch goed overgebracht aangezien er toch al na 9 minuten het goede antwoord gegeven was.

In ieder geval bedankt voor de hulp en voor het meedenken, maar het ging alleen even over dit specifieke probleempje en ik kan het systeem goed of fout opzetten, maar het hele systeem beschrijven voor een klein vraagje gaat me toch iets te ver.

Dus iedereen die nog zegt dat ik beter het dbase model kan normaliseren bij voorbaat dank voor je hulp, maar dat gaat nou eenmaal niet zo makkelijk.
Pagina: 1