[MySQL 3.23] Rijen samenvoegen

Pagina: 1
Acties:

  • Possstema
  • Registratie: Juli 2002
  • Laatst online: 10-11 10:49
Hallo, wij hebben een school-opdracht om een systeem te maken voor docenten om opdrachten uit te wisselen. Uiteraard hebben we ook een zoekformulier om op opdrachten te zoeken. En ik wil graag bij de resultaten de bijbehorende vakken geven als resultaat. Alleen is er het probleem dat er bij 1 opdracht meerdere vakken kunnen horen. Dit wou ik dus samenvoegen als 1 string, gescheiden door comma's omdat het zo toch wordt weergegeven bij het resultaat.
Na even zoeken kwam ik erachter dat de functie GROUP_CONCAT daarvoor was, maar aangezien de server waar het op MOET draaien mysql 3.23 heeft bestaat die functie niet. Nu heb ik een functie gevonden die GROUP_CONCAT simuleerd namelijk:
 
SQL:
1
2
3
4
5
6
7
8
set @result = '';

select @result := concat(@result, name, ', ')
from oefs_metadata_link, oefs_metadata
where assignmentID = 1
and ID = metadataID;

select @result as Vakken;


Ik weet alleen niet hoe ik verder moet. Dit is de huidige Query ( Zwaar versimpeld, maar geldig voor de vraag ) en je moet SAMENGEVOEGD dus vervangen door de functie, maar hoe??
SQL:
1
2
3
SELECT `oefs_assignments`.*, SAMENGEVOEGD(`oefs_metadata`.`name`)
FROM `oefs_assignments`, `oefs_metadata`, `oefs_metadata_link` 
WHERE `oefs_assignments`.`title` LIKE '%'
( De JOIN's moet je er even bijverzinnen )

Dit is de dblayout ( Ook versimpeld ):
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CREATE TABLE `oefs_assignments` (
  `ID` int(11) unsigned NOT NULL auto_increment,
  `title` varchar(50) NOT NULL default '',
  PRIMARY KEY  (`ID`)
);

CREATE TABLE `oefs_metadata` (
  `ID` int(11) unsigned NOT NULL auto_increment,
  `catID` int(11) unsigned NOT NULL default '0',
  `name` varchar(50) NOT NULL default '',
  PRIMARY KEY  (`ID`)
);

CREATE TABLE `oefs_metadata_cats` (
  `ID` int(11) unsigned NOT NULL auto_increment,
  `name` varchar(50) NOT NULL default '',
  PRIMARY KEY  (`ID`)
);

CREATE TABLE `oefs_metadata_link` (
  `assignmentID` int(11) unsigned NOT NULL default '0',
  `metadataID` int(11) unsigned NOT NULL default '0',
  PRIMARY KEY  (`assignmentID`,`metadataID`)
);

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Waarom wil je dat per-sé in 1 veld (komma separated) hebben? Je kunt toch in je code alsnog die velden achter elkaar plakken in een lusje? Dan geef je dus wat meer records terug uit je DB maar hou je wel je GUI los van je database; je DB hoort IMHO dit soort werk niet eens te doen; presentatie van je gegevens hou je in je presentatielaag (je "GUI") en opslag / ophalen van je gegevens in je persistentielaag.

Zowieso is GROUP_CONCAT nogal MySQL-only (zoals nog veel meer stuff :X ) en is het dus niet erg makkelijk te porten naar een andere DB zou je dat ooit willen. Ik beweer niet dat het anders veel makkelijker is, maar het is een begin ;)

[ Voor 40% gewijzigd door RobIII op 18-12-2006 23:00 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Possstema
  • Registratie: Juli 2002
  • Laatst online: 10-11 10:49
RobIII schreef op maandag 18 december 2006 @ 22:57:
Waarom wil je dat per-sé in 1 veld (komma separated) hebben? Je kunt toch in je code alsnog die velden achter elkaar plakken in een lusje? Dan geef je dus wat meer records terug uit je DB maar hou je wel je GUI los van je database; je DB hoort IMHO dit soort werk niet eens te doen; presentatie van je gegevens hou je in je presentatielaag (je "GUI") en opslag / ophalen van je gegevens in je persistentielaag.
Ja, maar als ik het dan alsnog in PHP aan de hand van welke id's zijn hetzelfde, de vakken aanelkaar ga plakken dan is dat ('lijkt me') trager dan als je dat zo doet via MySQL...

[ Voor 12% gewijzigd door een moderator op 18-12-2006 23:09 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Possstema schreef op maandag 18 december 2006 @ 23:06:
[...]
Ja, maar als ik het dan alsnog in PHP aan de hand van welke id's zijn hetzelfde, de vakken aanelkaar ga plakken dan is dat ('lijkt me') trager dan als je dat zo doet via MySQL...
Die paar milliseconden (tenzij je huge resultsets hebt) gaat een gebruiker écht niet merken hoor ;)
Overigens heb ik geen idee wat de performance-draw is van Group_Concat maar het zou me niks verbazen als MySQL er minder snel uit is dan je denkt ;)

Zowieso zitten er nogal wat "but's" aan een Group_Concat (check) en is dit (IMHO) gewoon premature optimization (en dus de root van all evil :+ )

offtopic:
Excuses voor de edit van je bericht :P Had een quote moeten zijn :X

[ Voor 49% gewijzigd door RobIII op 18-12-2006 23:14 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij