[MySQL] Afhankelijk van waarden in rijen joinen op databases

Pagina: 1
Acties:

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

Ik wil een lastige MySQL-join maken, maar ik weet niet of het mogelijk is, en zo ja, op welke manier het kan.

Ik heb een database met daarin de volgende MySQL-tabel:
code:
1
2
3
4
CREATE TABLE `aanmeldingen` (
  `db` varchar(64) NOT NULL default '',
  `id` int(10) NOT NULL default '0'
)

Hierin staan gebruikers (die zich ergens voor hebben aangemeld), die over verschillende databases zijn verspreid. Kolom 'db' bevat de database waarin de gebruiker staat, en kolom 'id' het id-nummer van de gebruiker binnen de database 'db'. Bijvoorbeeld:
code:
1
2
INSERT INTO `aanmeldingen` VALUES ('foo', 4);
INSERT INTO `aanmeldingen` VALUES ('bar', 23);

De databases 'foo' en 'bar' zijn databases met onder andere de volgende MySQL-tabel:
code:
1
2
3
4
CREATE TABLE `gebruikers` (
  `id` int(10) NOT NULL default '0',
  `naam` varchar(127) NOT NULL default ''
)

De tabel foo.gebruikers bevat:
code:
1
INSERT INTO `gebruikers` VALUES (4, 'Jan');


De tabel bar.gebruikers bevat:
code:
1
INSERT INTO `gebruikers` VALUES (23, 'Piet');


Nu wil ik graag met één query het volgende krijgen:
code:
1
2
3
4
id  naam
------------
4   Jan
23  Piet

Ik stel me voor dat een dergelijke query er als volgt uitziet:
code:
1
2
3
4
5
SELECT aanmeldingen.id, `db`.gebruikers.naam
FROM aanmeldingen
LEFT JOIN `db`.gebruikers
ON aanmeldingen.id = `db`.gebruikers.id
ORDER BY `db`.gebruikers.naam

Dit werkt natuurlijk niet, maar zoiets zou ik wel graag hebben.

Weet iemand of dit mogelijk is, en zo ja, op welke manier het kan? Alvast heel erg bedankt!

Jeroen

[ Voor 7% gewijzigd door Jeeeroen op 04-04-2006 18:59 ]


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Helaas, dat gaat niet. Een database of tabel is geen "first class citizen" binnen de MySQL taal, m.a.w. de database en tabel in een query staan vast, die kan je niet met je query beinvloeden. Wat jij wilt is niet mogelijk in MySQL.

Je kan natuurlijk wel vanuit je programmeertaal een query afschieten om de aanmeldingen tabel in te lezen, en vervolgens connecties opzetten naar de andere tabellen om de gebruikers-tabellen in te zien.

Of je afvragen waar je mee bezig bent, want blijkbaar wil je gegevens combineren die over verschillende databases verspreid staat. Misschien is het wel handig om die gegevens binnen 1 database te plaatsen (indien mogelijk).

[ Voor 13% gewijzigd door Infinitive op 04-04-2006 19:15 ]

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • Jeeeroen
  • Registratie: Juni 2004
  • Niet online
Bedankt voor je antwoord, Infinitive.

Jammer dat het niet mogelijk is, maar ik vreesde al zoiets. Mijn vraag was wat uitgebreid, maar het selecteren van gegevens uit verschillende tabellen binnen één database, die op dezelfde manier als databases in mijn vraag variabel zijn, geeft natuurlijk hetzelfde probleem.

Het draait er dus altijd op uit dat meerdere queries gebruikt moeten worden: in ieder geval per variabele tabel/database één query. Dat vind ik erg inefficiënt, dus ik ben nog op zoek naar een goede oplossing voor een goede databasestructuur voor een dergelijke constructie. Weer een nieuwe uitdaging... :-)

  • Jeeeroen
  • Registratie: Juni 2004
  • Niet online
Zou het een goed idee zijn om hier een MERGE-tabel voor te gebruiken?

code:
1
2
3
4
5
CREATE TABLE alle_gebruikers (
  `id` int(10) NOT NULL default '0',
  `naam` varchar(127) NOT NULL default ''
) TYPE = MERGE UNION = (foo.gebruikers, bar.gebruikers)
INSERT_METHOD = LAST


Dan kan ik makkelijk de tabel alle_gebruikers joinen op de tabel aanmeldingen.

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

...
When you create a MERGE table, MySQL creates two files on disk. The files have names that begin with the table name and have an extension to indicate the file type. An .frm file stores the table format, and an .MRG file contains the names of the tables that should be used as one. (Originally, all used tables had to be in the same database as the MERGE table itself. This restriction has been lifted as of MySQL 4.1.1.)
...
http://mirror.tomato.it/m...merge-storage-engine.html

Als je MySQL nieuw genoeg is, zou het moeten werken denk ik. Waarom eigenlijk 2 databases? Kun je niet de boel in 1 database zetten?

Fat Pizza's pizza, they are big and they are cheezy


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
In het verleden is het mij wel gelukt om in mysql verschillende databases te gebruiken door de notatie : dbase.tabel.kolom te gebruiken.
Dit was wel met myisam tabellen, querys werden uitgevoerd onder root.
En ik heb op dit moment geen mysql-server om het eventjes te gaan proberen. Maar in het verleden is me dit nog wel eens gelukt ( was makkelijk voor gebruikers authenticatie tussen web-applicaties met verschillende dbases ).

Maar waarom niet gewoon 1 dbase met de tabelnamen voorafgegaan door iets van klantnr ??? dus 1_gebruikers, 2_gebruikers etc.etc.

Verwijderd

Jeeeroen schreef op dinsdag 04 april 2006 @ 19:50:
Zou het een goed idee zijn om hier een MERGE-tabel voor te gebruiken?

code:
1
2
3
4
5
CREATE TABLE alle_gebruikers (
  `id` int(10) NOT NULL default '0',
  `naam` varchar(127) NOT NULL default ''
) TYPE = MERGE UNION = (foo.gebruikers, bar.gebruikers)
INSERT_METHOD = LAST


Dan kan ik makkelijk de tabel alle_gebruikers joinen op de tabel aanmeldingen.
Mocht je geen gebruik maken van MyIsam kun je dit doen:
code:
1
2
3
4
5
6
7
8
9
10
SELECT *
FROM merge.aanmeldingen, (

SELECT *
FROM foo.gebruikers
UNION ALL
SELECT *
FROM bar.gebruikers
) AS gebruikers
WHERE aanmeldingen.id = gebruikers.id


De database merge is dus de algemene database.

De UNION zul je dus met een programmatuur moeten bepalen:
code:
1
2
SELECT DISTINCT db
FROM aanmeldingen


En dan met je code de union opbouwen.

Mocht je zelfs geen UNION kunnen doen, dan moet je dit oplossen met een temporary table. Zie de MySql docs.

Vullen van die temporary tabel kun je dan met INSERT SELECT doen: http://dev.mysql.com/doc/refman/4.1/en/insert-select.html

[ Voor 33% gewijzigd door Verwijderd op 04-04-2006 22:32 ]


  • Jeeeroen
  • Registratie: Juni 2004
  • Niet online
Bedankt voor alle reacties, ik heb er een goede oplossing door gevonden.

  • dip
  • Registratie: September 2003
  • Laatst online: 16-01-2023

dip

shut up ulé

Wat voor oplossing? Dan hebben anderen er ook misschien nog iets aan. :)

It's scientifically known, that base improves the tase of cheezes!


  • Jeeeroen
  • Registratie: Juni 2004
  • Niet online
dip schreef op donderdag 06 april 2006 @ 13:02:
Wat voor oplossing? Dan hebben anderen er ook misschien nog iets aan. :)
De oplossingen die hierboven worden beschreven. :)
Pagina: 1