[MySQL] Kolommen uit verschillende rijen aan elkaar plakken

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

  • Jeeeroen
  • Registratie: Juni 2004
  • Niet online
Hallo,

Ik wil graag in een MySQL-query kolommen uit verschillende rijen die bij elkaar horen, in één kolom aan elkaar plakken. Laat ik mijn probleem meteen maar beschrijven aan de hand van een voorbeeld, anders wordt het niks.

Ik heb de volgende tabellen:
  • items: een lijst van items
  • cats: een lijst van categorieën
  • items_cats: koppeling van items aan één of meerdere categorieën
De bijbehorende tabelquery's:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TABLE `items` (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT ,
`naam` VARCHAR( 32 ) NOT NULL ,
PRIMARY KEY ( `id` )
)

CREATE TABLE `cats` (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT ,
`naam` VARCHAR( 32 ) NOT NULL ,
PRIMARY KEY ( `id` )
)

CREATE TABLE `items_cats` (
`item_id` INT( 10 ) NOT NULL ,
`cat_id` INT( 10 ) NOT NULL ,
PRIMARY KEY ( `item_id` , `cat_id` )
)

Ik voer nu de volgende query uit:
code:
1
2
3
4
SELECT items.naam AS itemNaam, cats.naam AS catNaam
FROM items, cats, items_cats
WHERE items.id = items_cats.item_id
AND cats.id = items_cats.cat_id

Het resultaat hiervan is bijvoorbeeld:

[b]itemNaam	catNaam[/b]
auto		sport
auto		verkeer
voetbal		sport

Ik zou nu graag de waarden van de kolom catNaam binnen de query per rij uit de tabel items aan elkaar willen plakken, zodat het resultaat als volgt wordt:

[b]itemNaam	catNaam[/b]
auto		sport, verkeer
voetbal		sport

Dit kan ik immers veel makkelijker in een programmeertaal verwerken, dan het bovenste resultaat.

Mijn vraag is dus: Is dit mogelijk en zo ja, hoe?

Alvast heel erg bedankt!

  • wizl
  • Registratie: Maart 2001
  • Laatst online: 27-02-2023

wizl

hmmz

Volgens mij gaat dat niet, maar met het resultaat wat je al hebt is in een programmeertaal ook prima te werken. Je gaat namelijk de records 1 voor 1 af totdat je itemNaam anders wordt. Eigenlijk hetzelfde?

[edit]
group_concat dus :)

[ Voor 23% gewijzigd door wizl op 26-02-2006 20:23 ]


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Jeeeroen schreef op zondag 26 februari 2006 @ 20:05:
Mijn vraag is dus: Is dit mogelijk en zo ja, hoe?
Heb je al gekeken naar group_concat?

Verwijderd

Dat is waar een join voor bedoeld is, zou zo moeten kunnen:

code:
1
2
3
SELECT items.naam AS itemNaam, cats.naam AS catNaam FROM items
LEFT JOIN items_cats AS connect ON items.id = connect.item_id
LEFT JOIN cats ON cats.id = connect.cat_id

[ Voor 11% gewijzigd door Verwijderd op 26-02-2006 20:28 ]


  • Jeeeroen
  • Registratie: Juni 2004
  • Niet online
Verwijderd schreef op zondag 26 februari 2006 @ 20:25:
Dat is waar een join voor bedoeld is, zou zo moeten kunnen:
code:
1
2
3
SELECT items.naam AS itemNaam, cats.naam AS catNaam FROM items
LEFT JOIN items_cats AS connect ON items.id = connect.item_id
LEFT JOIN cats ON cats.id = connect.cat_id
Dan komt er precies hetzelfde uit. Ik maak al gebruik van een join, zoals je (blijkbaar niet) ziet.

group_concat ziet er veelbelovend uit, ik ga er meteen naar kijken!

[ Voor 7% gewijzigd door Jeeeroen op 26-02-2006 20:29 ]


Verwijderd

Jeeeroen schreef op zondag 26 februari 2006 @ 20:28:
[...]

Dan komt er precies hetzelfde uit. Ik maak al gebruik van een join, zoals je (blijkbaar niet) ziet.

group_concat ziet er veelbelovend uit, ik ga er meteen naar kijken!
Sorry, ik had het niet helemaal gelezen, ik zie nu wat je bedoeld. Denk inderdaad niet dat dat puur met sql lukt.

[edit: en ik lag weer achter, con_cat ziet er inderdaad 'veelbelovend' uit]

[ Voor 9% gewijzigd door Verwijderd op 26-02-2006 20:30 ]


  • Jeeeroen
  • Registratie: Juni 2004
  • Niet online
Wat een vondst!

Hierbij de oplossing:
code:
1
2
3
4
5
6
SELECT items.naam AS itemNaam,
GROUP_CONCAT(cats.naam ORDER BY cats.naam SEPARATOR ', ') AS cats
FROM items, cats, items_cats
WHERE items.id = items_cats.item_id
AND cats.id = items_cats.cat_id
GROUP BY items.id

Heel erg bedankt allemaal!

[ Voor 7% gewijzigd door Jeeeroen op 26-02-2006 20:33 ]

Pagina: 1