Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[MySQL] Waarde van kolom als tabelnaam in dezelfde query?

Pagina: 1
Acties:

  • Maghiel
  • Registratie: Maart 2004
  • Laatst online: 17:50
Is het in MySQL mogelijk om de waarde van een kolom als tabelnaam te gebruiken in 1 query?

Voorbeeldje van wat ik in gedachte had:
SQL:
1
2
3
4
5
SELECT `tbl1`.`type, `tbl1`.`type_id`
    CASE `tbl1`.`type` WHEN `sometype` THEN `tbl2`
    END AS `tablename`
FROM `tbl1`
LEFT JOIN `tablename` ON `tbl1`.`type_id` = `tablename`.`id`


Maar dat gaat natuurlijk niet werken.

Ik weet dat je een variabele kan setten met bv SET @foo = bar, maar dan moet ik alsnog een extra query uitvoeren.

  • Noork
  • Registratie: Juni 2001
  • Niet online
Ik snap er weinig van. Wat wil je er precies mee bereiken?

  • Kettrick
  • Registratie: Augustus 2000
  • Laatst online: 10:36

Kettrick

Rantmeister!

Ga eens goed nadenken "waarom" je dit precies wil :), meestal is er iets niet helemaal in orde met de datamodel als je dergelijke hacks toe moet passen :)

  • Maghiel
  • Registratie: Maart 2004
  • Laatst online: 17:50
Ik heb een tabel met acties:

SQL:
1
2
3
4
5
6
7
8
9
10
CREATE TABLE IF NOT EXISTS `actions` (
  `id` int(11) NOT NULL auto_increment,
  `group_id` int(11) NOT NULL,
  `type` enum('message','photo','video','link') NOT NULL,
  `type_id` int(11) NOT NULL,
  `is_comment` enum('0','1') NOT NULL,
  `timestamp` datetime NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `group_id` (`group_id`,`user_id`,`type`,`type_id`,`is_comment`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;


Een actie is dat iemand een item plaats, bv een message, een photo, een video of een link.

Die verschillende acties staan dan weer in andere tabellen, bijvoorbeeld die van berichten:
SQL:
1
2
3
4
5
6
7
8
9
10
CREATE TABLE IF NOT EXISTS `messages` (
  `id` int(11) NOT NULL auto_increment,
  `group_id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `message` text NOT NULL,
  `comment_thread_id` int(11) NOT NULL,
  `timestamp` datetime NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `group_id` (`group_id`,`user_id`,`comment_thread_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;


Nou wil ik het dus mogelijk maken dat als ik een lijst van acties ophaal, ik ook gelijk de informatie van die actie uit de corresponderende tabel haal.

De reden dat ik niet gewoon alle tabellen join(messages, photos, etc), is omdat ik vaak een kort overzichtje moet hebben van de verschillende type acties die er geweest zijn, en het dan veel sneller is om het uit die koppeltabel te halen dan alle tabellen te joinen.

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 17:38

MBV

Klinkt al een stuk minder fout dan de eerste post. Je zal toch alle tabellen moeten joinen, waarschijnlijk is dat met goede indexing sneller dan jouw constructie met PL-SQL-achtige constructies. Hij haalt namelijk alleen gegevens op uit de tabel als hij de actieid kan vinden.

Ik zou dan zoiets doen:
SQL:
1
2
3
4
5
SELECT x,y,z
FROM actons a
LEFT JOIN messages m 
  ON a.type='message' AND a.type_id = m.id
WHERE a.id = 1337

Door de a.type=message geeft hij direct al FALSE terug, en haalt hij niks uit de messages-tabel.

Toch zou je je datastructuur even opnieuw moeten heroverwegen, dit soort trucs moet je normaal niet nodig hebben...

[ Voor 20% gewijzigd door MBV op 17-09-2008 19:02 ]


  • Maghiel
  • Registratie: Maart 2004
  • Laatst online: 17:50
MBV schreef op woensdag 17 september 2008 @ 19:01:
Klinkt al een stuk minder fout dan de eerste post. Je zal toch alle tabellen moeten joinen, waarschijnlijk is dat met goede indexing sneller dan jouw constructie met PL-SQL-achtige constructies. Hij haalt namelijk alleen gegevens op uit de tabel als hij de actieid kan vinden.

Ik zou dan zoiets doen:
SQL:
1
2
3
4
5
SELECT x,y,z
FROM actons a
LEFT JOIN messages m 
  ON a.type='message' AND a.type_id = m.id
WHERE a.id = 1337

Door de a.type=message geeft hij direct al FALSE terug, en haalt hij niks uit de messages-tabel.

Toch zou je je datastructuur even opnieuw moeten heroverwegen, dit soort trucs moet je normaal niet nodig hebben...
Hey dat is een slimme! Dank je voor de tip!

Om eerlijk te zijn vond ik m'n datamodel wel goed bedacht eigenlijk. Aangezien ik dus, wat ik zei, vaak alleen de beknopte informatie nodig heb. Maar als je een tip hebt ;)
Ik ga er morgen nog even goed over nadenken ook weer, zit er nu even te lang in ;)

  • dvvelzen
  • Registratie: Februari 2002
  • Laatst online: 07-08 19:20
Wat voor soort "extra" info staat er dan in ide message / photo / etc tabellen ?

  • Maghiel
  • Registratie: Maart 2004
  • Laatst online: 17:50
Nu nog niet zoveel, bij berichten bv het bericht zelf, bij photo's afbeelding, bij videos een video. Zijn in feite gelijk nu nog. Maar in de toekomst gaan er veel verschillen tussen die items komen, daarom heb ik ze vast gesplitst. Nu zou het prima in 1 tabel kunnen inderdaad.

  • Noork
  • Registratie: Juni 2001
  • Niet online
Kun je niet b.v. meerdere queries uitvoeren, en met PHP de resultaten combineren naar 1 array en sorteren op datum? Of voor elk resultataat uit de actietabel weer een query uitvoeren voor de details? Door een beetje handig te cachen e.d. hoeft zoiets niet traag te zijn.

Waar dient het voor?

  • Maghiel
  • Registratie: Maart 2004
  • Laatst online: 17:50
Ik denk eigenlijk dat joinen sneller is dan voor elke actie een query uit te voeren.

Dit is ongeveer hoe ik het nu doe: http://pastebin.com/d34af62a (aub ff niet letten op die mysql class in de global ;))
Pagina: 1