[PHP/MySQL] Meerdere resultaten in 1 resultaat rij

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Anoniem: 62555

Topicstarter
Ik wist niet zo goed hoe ik dit probleem moest benoemen.
Maar het gaat dus om de weergave van 1 resultaat rij waarbij 2 N:N relaties (koppeltabellen) zijn betrokken.

Ik heb de volgende tabellen:


personen
pidpnaam
1persoon 1
2persoon 2
3persoon 3



provincies
pridprnaam
1provincie 1
2provincie 2
3provincie 3
4provincie 4
5provincie 5



persoon_provincie
ppidpersoonidpovincieid
111
212
313
423
524
625
734
831



persoon_provincie
ppidpersoonidpovincieid
111
212
313
423
524
625
734
831



persoon_auto
paidpersoonidautoid
111
212
313
424




Ik wil meerdere resultaatrijen in 1 resultaatrij tonen.
Ik wil dus per persoon 1 regel hebben, met daarin al zijn provincies in 1 veld en al zijn auto's in 1 veld.
Onderstaande afbeelding maakt een hoop duidelijk wat ik wil:
Afbeeldingslocatie: http://img147.imageshack.us/img147/6726/resultaten5cm.gif
Ook nog even een aanvullende ERD om de structuur te verduidelijken.
Afbeeldingslocatie: http://img147.imageshack.us/img147/1632/er7sk.gif
Dit is even een testcase met willekeurige items en waarden!

Mijn vraag is dus:
hoe krijg ik nu die resultaten zoals onderaan de afbeelding is weergegeven?
Ik heb al geprobeerd om 1 query beide queries te verwerken (2x joins).
Maar dan krijg ik logischerwijs een kruistabel als resultaat.
Nu zou je normaal gesproken ergens op moeten koppelen.
Maar beide koppeltabellen hebben natuurlijk niets met elkaar te maken.
Ook met een UNION gaat het niet goed, want dan krijg ik 4 resultaatrijen

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-06 00:38

NMe

Quia Ego Sic Dico.

Kun je geen union maken en die vervolgens groeperen op persoonid?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Anoniem: 88197

-NMe- schreef op vrijdag 10 februari 2006 @ 16:27:
Kun je geen union maken en die vervolgens groeperen op persoonid?
Ook met een UNION gaat het niet goed, want dan krijg ik 4 resultaatrijen
Idd, als je het groepeert, zal hij van de 4 rijen mss 1 goede maken :)

Acties:
  • 0 Henk 'm!

Anoniem: 62555

Topicstarter
Bedankt voor het idee .. dat is weer voor maandag :)

Acties:
  • 0 Henk 'm!

Anoniem: 62555

Topicstarter
Het was even zoeken en proberen, maar uiteindelijk ben ik eruit gekomen :)
Dit is de uiteindelijke query geworden (wellicht komt iemand ooit hetzelfde probleem tegen en dan is het toch lekker dat de oplossing erbij staat).
Misschien dat het nog korter kan, maar daar ben ik niet achter gekomen.
De oplossing is overigens voor MySQL 4.1

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
SELECT 
    pid,
    pnaam,
    GROUP_CONCAT("",provincies) AS provincies, 
    GROUP_CONCAT("",autos) AS autos 
FROM 
(SELECT 
    p.pid, 
    p.pnaam,
    NULL AS provincies, 
    GROUP_CONCAT("",a.anaam) AS autos 
FROM 
    personen AS p 
INNER JOIN 
    persoon_auto AS pa ON 
    p.pid = pa.persoonid  
    INNER JOIN 
        autos AS a ON 
        pa.autoid = a.aid 
GROUP BY 
    p.pid 
UNION ALL 
SELECT 
    p.pid,
    p.pnaam,
    GROUP_CONCAT("",pr.prnaam) AS provincies, 
    NULL AS autos 
FROM 
    personen AS p 
INNER JOIN 
    persoon_provincie AS pp ON 
    p.pid = pp.persoonid  
    INNER JOIN 
        provincies AS pr ON 
        pp.provincieid = pr.prid 
GROUP BY 
    p.pid) AS resultTable   
GROUP BY pid 
ORDER BY pnaam ASC

Acties:
  • 0 Henk 'm!

Anoniem: 53459

Wat is hier juist mis mee?

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT pid, pnaam,
    (
        SELECT GROUP_CONCAT(autos.anaam ORDER BY anaam SEPARATOR ', ')
        FROM persoon_auto
        INNER JOIN autos ON persoon_auto.autoid = autos.aid
        WHERE persoon_auto.persoonid = personen.pid
    ) AS autos,
    (
        SELECT GROUP_CONCAT(provincies.pnaam ORDER BY pnaam SEPARATOR ', ')
        FROM persoon_provincie
        INNER JOIN provincies ON persoon_provincie.provincieid = provincies.prid
        WHERE persoon_provincie.persoonid = personen.pid
    ) AS provincies
FROM personen 
WHERE ...
ORDER BY ..


Verder vind ik je naamgeving een klein beetje verwarrend.. Meervouden en enkelvouden door elkaar, soms afgekorte naam op id veld, soms niet. Misschien maak je dit beter wat homogener

[ Voor 2% gewijzigd door Anoniem: 53459 op 13-02-2006 10:35 . Reden: haakje te weinig ]


Acties:
  • 0 Henk 'm!

Anoniem: 62555

Topicstarter
Bedankt voor je info, maar waarom zeuren over de naamgeving in een TESTcase?! Dat draagt echt niets bij aan de vraag volgens mij... ik ga eens kijken of die query ook lekker loopt.

Acties:
  • 0 Henk 'm!

Anoniem: 53459

Gewoon, omdat ik veel moest checken tijdens het schrijven van die query :) Wat niet de bedoeling om te zeuren, misschien dat de naamgeving voor jou natuurlijk overkomt

Acties:
  • 0 Henk 'm!

Anoniem: 62555

Topicstarter
Ok dan! Ik heb die query getest en hij werkt idd.
Zo had ik m niet bedacht :) Bedankt, ik had al veel geleerd van mijn eigen oplossing, maar dit is weer een stapje beter!

Er zat nog wel een klein foutje in ... in provincies.pnaam -> moest prnaam zijn
Thanks!

Acties:
  • 0 Henk 'm!

Anoniem: 49627

Anoniem: 62555 schreef op maandag 13 februari 2006 @ 11:04:
Er zat nog wel een klein foutje in ... in provincies.pnaam -> moest prnaam zijn
Zo zie je maar hoe belangrijk naamgeving is. Ook in testcases.

Acties:
  • 0 Henk 'm!

Anoniem: 62555

Topicstarter
got that
Pagina: 1