[SQL] Join meerdere tabellen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Hemmen
  • Registratie: December 2009
  • Laatst online: 24-02 19:33
Ik wil een systeem maken met de volgende tabellen (heb even de niet relevante velden weggelaten):

nieuws

NIEUWS_ID, tekst

afdeling

AFDELING_ID, naam

nieuws_afdeling

NIEUWS_AFDELING_ID, NIEUWS_ID, AFDELING_ID

Een nieuwsbericht kan dus meerdere afdelingen bevatten en een afdeling kan dus in meerdere nieuwsberichten voorkomen (veel op veel).

Nu wil ik met 1 query alle nieuwsberichten tonen met daar achter de juiste afdelingnamen. Aan een nieuwsbericht zouden dus meerdere afdelingen gekoppeld kunnen zijn dus:

nieuws.text afdeling.naam

Ik krijg het echter niet voor elkaar met deze query:

SQL:
1
SELECT * FROM nieuws INNER JOIN nieuws_afdeling ON nieuws.NIEUWS_ID=nieuws_afdeling.NIEUWS_ID INNER JOIN afdeling ON nieuws_afdeling.AFDELING_ID=afdeling.AFDELING_ID


Zo krijg ik enkel de 1e row.....?

Heb op diverse fora gekeken voor joins ivm meerdere tabellen maar heb het licht tot nu toe niet gezien...
Is het uberhaupt wel mogeijk met 1 query? Ik heb al vanallerhande combinaties gebruikt.

Daarnaast vraag ik me af hoe ik dat het beste met php kan tonen want ik wil de afdelingsnamen allemaal onder 1 rij tonen ipv meerdere rijen.

Dus:

Tekst nieuwsbericht 1, afdeling1, afdeling2, afdeling 2

ipv

Tekst nieuwsbericht 1, afdeling1
Tekst nieuwsbericht 1, afdeling2
Tekst nieuwsbericht 1, afdeling3

Ik hoop dat jullie mij hier mee kunnen helpen want ik ben hier al paar dagen mee zoet O+

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Dit is meestal niet zo makkelijk mogelijk in SQL, en het makkelijkst is om het gewoon procedureel op te lossen in de omgeving waarmee je de SQL uitvoert. Het is ook typisch een presentatie kwestie.

Aangezien je niet weet hoeveel afdelingen er zijn zul je het niet met een simpele join redden, want je zou per afdeling een join moeten doen, maar dat kan niet variabel. Wat je zou moeten doen is alle afdelingen selecteren en die tabel pivotten en daaraan joinen. PIVOT functies zijn echter niet standaard, en dus zul je naar database specifieke oplossingen. ( Voor MS-SQL kun je hier kijken: MSDN: Using PIVOT and UNPIVOT )

Als je het geen probleem vindt om alle afdelingen te combineren in een tekst collumn en MySql gebruikt is er werl een mogelijkheid. MySql heeft namelijk een GROUP_CONCAT aggregate function waarmee je dat wel kunt bereiken

[ Voor 59% gewijzigd door Woy op 28-03-2012 10:13 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Hemmen
  • Registratie: December 2009
  • Laatst online: 24-02 19:33
Woy schreef op woensdag 28 maart 2012 @ 10:08:
Dit is meestal niet mogelijk in SQL, en het makkelijkst is om het gewoon procedureel op te lossen in de omgeving waarmee je de SQL uitvoert. Het is ook typisch een presentatie kwestie.

MySql heeft echter een Concat aggregate function waar je wel mee kunt bereiken wat je wil.
De Query was overigens wel goed... Ik had een ander foutje gemaakt in mijn code waardoor alle afdelingen aan hetzelfde nieuwsitem gekoppeld werden... dat is dus opgelost. Nu nog de PHP code om van dit:

Tekst nieuwsbericht 1, afdeling1
Tekst nieuwsbericht 1, afdeling2
Tekst nieuwsbericht 1, afdeling3

dit te maken:

Tekst nieuwsbericht 1, afdeling1, afdeling2, afdeling 2

Zal eens gaan prullen. Mocht iemand suggesties hebben voor een constructie zou dat meegenomen zijn O-)

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Gewoon een simpel lusje
code:
1
2
3
4
5
6
7
foreach(row in rows)
{
    if( lastRow.Bericht == row.Bericht )
        AddAfdeling(row);
    else
        NieuwBericht();
}

Dan moet je natuurlijk wel even op het nieuwsbericht sorteren zodat ze netjes gegroepeerd staan.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Hemmen
  • Registratie: December 2009
  • Laatst online: 24-02 19:33
Woy schreef op woensdag 28 maart 2012 @ 10:08:
Dit is meestal niet zo makkelijk mogelijk in SQL, en het makkelijkst is om het gewoon procedureel op te lossen in de omgeving waarmee je de SQL uitvoert. Het is ook typisch een presentatie kwestie.

Aangezien je niet weet hoeveel afdelingen er zijn zul je het niet met een simpele join redden, want je zou per afdeling een join moeten doen, maar dat kan niet variabel. Wat je zou moeten doen is alle afdelingen selecteren en die tabel pivotten en daaraan joinen. PIVOT functies zijn echter niet standaard, en dus zul je naar database specifieke oplossingen. ( Voor MS-SQL kun je hier kijken: MSDN: Using PIVOT and UNPIVOT )

Als je het geen probleem vindt om alle afdelingen te combineren in een tekst collumn en MySql gebruikt is er werl een mogelijkheid. MySql heeft namelijk een GROUP_CONCAT aggregate function waarmee je dat wel kunt bereiken
Ik heb nu onderstaande Query met GROUP_CONCAT uitgevoerd maar dan krijg ik maar 1 row terug terwijl er 2 rows zijn (2 nieuwsberichten). Hij groepeert wel netjes de afdelingen. Als ik GROUP_CONCAT() weg laat krijg ik wel de juiste rijen.... 8)7

SQL:
1
SELECT reports.REPORT_ID, departments.DEPARTMENT_ID, GROUP_CONCAT(departments.name) FROM reports_departments INNER JOIN reports ON reports_departments.REPORT_ID=reports.REPORT_ID INNER JOIN departments ON reports_departments.DEPARTMENT_ID=departments.DEPARTMENT_ID

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je moet natuurlijk wel GROUP BY gebruiken bij een aggregate function

Hoe werkt dat GROUP BY nou eigenlijk?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Hemmen
  • Registratie: December 2009
  • Laatst online: 24-02 19:33
Woy schreef op woensdag 28 maart 2012 @ 10:50:
Je moet natuurlijk wel GROUP BY gebruiken bij een aggregate function

Hoe werkt dat GROUP BY nou eigenlijk?
Geweldig! Dank u dank u! Het is gelukt! _/-\o_

SQL:
1
SELECT reports.REPORT_ID, departments.DEPARTMENT_ID, GROUP_CONCAT(departments.name) FROM reports_departments INNER JOIN reports ON reports_departments.REPORT_ID=reports.REPORT_ID INNER JOIN departments ON reports_departments.DEPARTMENT_ID=departments.DEPARTMENT_ID GROUP BY reports.REPORT_ID

[ Voor 31% gewijzigd door Hemmen op 29-03-2012 13:08 ]

Pagina: 1