PHP, MySQL - Slå ihop vissa celler

Permalänk
Medlem

PHP, MySQL - Slå ihop vissa celler

Hej.

Jag håller på med en kontaktlista till en förskola. Jag har byggt en relationsdatabas och vill kunna presentera en snygg lista lista på hemsidan. Nu har jag stött på lite patrull i själva layouten. Jag ska försöka förklara.

De data som ska visas är föräldrars namn, mobiltelefon, e-post och barnens namn. Under designen av databasen har jag tagit hänsyn till följande:
- Ett barn kan ha en eller flera föräldrar
- En förälder kan ha ett eller flera barn

Utifrån detta har jag gjort följande tabeller med kolumner
föräldrar - id_föräldrar, namn, mobiltelefon, e-post
barn - id_barn, namn
föräldrar_barn - id_barn(FK id_barn i tabellen barn), id_föräldrar(FK id_föräldrar i tabellen föräldrar)
Detta är för att föräldrar-barn blir ett många-till-många-förhållande. Därav den tredje tabellen.

Sedan listar jag tabellerna med en enkel SELECT och JOIN. Sedan använder jag standardförfarandet i PHP för att presentera det på sidan (mysql_query, mysql_fetch_assoc) Det funkar jättebra tekniskt, men det ser inte så snyggt ut i en lista. T ex en familj med två barn blir så här:

Jessica Eriksson 070-XXXXXXX jessica@gmail.com Kalle Eriksson
Peter Eriksson 070-XXXXXXX peter@hotmail.com Kalle Eriksson
Jessica Eriksson 070-XXXXXXX jessica@gmail.com Anna Eriksson
Peter Eriksson 070-XXXXXXX peter@hotmail.com Anna Eriksson

Det jag vill ha är istället
Jessica Eriksson 070-XXXXXXX jessica@gmail.com Kalle Eriksson
Peter Eriksson 070-XXXXXXX peter@hotmail.com Anna Eriksson

Jag har prövat med bl a GROUP_CONCAT, men det ger inte riktigt det resultat jag vill ha. Samma data visas ändå två gånger. Just nu försöker jag laborera lite med nästlade while-satser men det verkar inte heller vara rätt väg att gå. Någon som har någon bra lösning på detta?

Visa signatur

Ne nos sequere nobis secede

Permalänk
Medlem

Har du provat med: GROUP BY föräldrar.namn ? Eller möjligtvis på telefonnummer som är lite mer unikt än namnet.

Visa signatur

Intel i7 2600K @ 4.5GHz | GeForce GTX 680 | ASUS P8P67 PRO | Corsair Dominator 16GB 1600MHz | Samsung 830 256GB

Permalänk
Hedersmedlem
Skrivet av Wolfclaw:

Jag har prövat med bl a GROUP_CONCAT, men det ger inte riktigt det resultat jag vill ha. Samma data visas ändå två gånger. Just nu försöker jag laborera lite med nästlade while-satser men det verkar inte heller vara rätt väg att gå. Någon som har någon bra lösning på detta?

Visa kod!

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Skrivet av Wolfclaw:

Jag har prövat med bl a GROUP_CONCAT, men det ger inte riktigt det resultat jag vill ha. Samma data visas ändå två gånger. Just nu försöker jag laborera lite med nästlade while-satser men det verkar inte heller vara rätt väg att gå. Någon som har någon bra lösning på detta?

Ej testat, men något sånt här borde funka:

Hämta alla barn:

select * from barn

Hämta föräldrarna för resp. barn:

select a.id_barn, b.* from föräldrar_barn a, föräldrar b where a.id_barn IN(select id_barn from barn)

Sedan kör du en fetch assoc på båda till arrayer, loopar över barnen och för varje barn kollar du i förälder-arrayen vilka föräldrarna är.

Permalänk
Medlem
Skrivet av infinity08:

Ej testat, men något sånt här borde funka:

Hämta alla barn:

select * from barn

Hämta föräldrarna för resp. barn:

select a.id_barn, b.* from föräldrar_barn a, föräldrar b where a.id_barn IN(select id_barn from barn)

Sedan kör du en fetch assoc på båda till arrayer, loopar över barnen och för varje barn kollar du i förälder-arrayen vilka föräldrarna är.

Den andra satsen funkade inte alls. Jag fick avbryta den manuellt och då hade den genererat över 3000 rader, av 50 föräldrar. Har försökt förstå hur subqueries funkar men förstår ärligt talat inte vad man använder dem till eller hur de fungerar, trots att jag försökt förstå vad som står på MYSQLs hemsida. Får mest bara "ERROR subquery returned more than 1 row", eller syntaxfel.

Det jag använt nu är JOIN på följande sätt:

SELECT f.namn, b.namn FROM föraldrar f JOIN föraldrar_barn USING(id_föräldrar) JOIN barn b USING(id_barn);

Då får jag en listning som jag beskrev i första inlägget, där t ex föräldrar med två barn visas två gånger.

Visa signatur

Ne nos sequere nobis secede