[MySQL] Tablename uit query halen en meteen een join op doen

Pagina: 1
Acties:

  • $tranger
  • Registratie: Januari 2000
  • Laatst online: 07-04 13:54
... anders dan dat kan ik het niet omschrijven ;-)

Op het moment ben ik bezig met een site waar ik een indices tabel gebruik om de id, titel en url van een bericht op te slaan en een paar losse tabellen waar de betreffende content in staat. Om aan te geven wat voor content bij de index hoort heb ik een veld 'type' die 1 op 1 de tabelnaam bevat.

Om een record in 1 query uit te lezen vraag ik me af of ik een dergelijke constructie zou kunnen uitvoeren;

code:
1
SELECT indices.id,indices.titel,indices.type AS tabel,tabel.* FROM indices LEFT JOIN tabel ON tabel.iid=indices.id


Ten eerste ben ik er niet zeker van of deze constructie mogelijk is, maar misschien heeft iemand een idee. Subqueries heb ik al geprobeerd maar is volgens mij niet te gebruiken in deze situatie.

Indien niet anders mogelijk kan ik het via een workaround oplossen of eventueel een extra query. Ook ben ik benieuwd naar de performance, maar zolang ik dit nog niet werkend heb valt er weinig te vergelijken, of iemand moet mij kunnen vertellen of dit oplossen via een subquery juist een trage oplossing is...?

Tevens zal ik vanzelf wel horen wat voor critiek deze constructie kan verwachten, hè O-)

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22:58

Janoz

Moderator Devschuur®

!litemod

Dit gaat in SQL in iedergeval niet werken. Dit zou je eigenlijk op moeten lossen door die andere tabellen samen te voegen tot een generieke tabel. Aan die generieke tabel kun je eventueel specifiekere tabellen joinen. Door dit alles te outerjoinen krijg je inderdaad een grote recordset met veel nulls erin, maar dat zal iig beter performen dan meerdere queries loslaten.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

't Kan geloof ik wel met zoiets tot op zekere hoogte
SQL:
1
2
3
4
5
6
7
SELECT ...
CASE i.type WHEN 'type1' THEN tt1.veld1 WHEN 'type2' THEN tt2.veld1 END as veld1
...
FROM
   indices i
  LEFT JOIN tabel_type1 tt1 ON CASE WHEN i.type = 'type1' THEN tt1.iid = i.id ELSE false END
  LEFT JOIN tabel_type2 tt2 ON CASE WHEN i.type = 'type2' THEN tt2.iid = i.id ELSE false END


Maar je kan natuurlijk op je vingers natellen dat dat een draak van een join wordt en ik geef je dit voorbeeld eigenlijk alleen 'omdat het kan'. Waarschijnlijk ben je beter af met losse queries, bij MySQL hebben de simpele queries een relatief lage overhead.

Een andere oplossing is eventueel nog om voor elke tabeltype een losse query uit te voeren die je dmv een stel UNION's aan elkaar plakt.