Gegevens selecteren van 2 databases
Ik werk met PHPMyAdmin en maak contact met mijn database via het volgende connect-bestandje
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$server = "localhost";
$user = "xx";
$wachtwoord = "xx";
$database="kp34009_eerste";
$query = "xx" ;
$db=mysql_connect($server, $user, $wachtwoord); // verbinding maken
mysql_select_db($database, $db);
?>
$server = "localhost";
$user = "xx";
$wachtwoord = "xx";
$database="kp34009_eerste";
$query = "xx" ;
$db=mysql_connect($server, $user, $wachtwoord); // verbinding maken
mysql_select_db($database, $db);
?>
Maar ik wil nu informatie selecteren van twee databases. Ik wil niet alleen gegevens van kp34009_eerste, maar ook van kp34009_tweede.
Hoe doe ik dat in dit bestand?
En hoe maak ik de query. Ik probeer het met:
SELECT * FROM eerste AND tweede
Maar dit lukt dit niet.
Of heb je aparte query's nodig van de ene DB en aparte query's van de andere?
---
O, dus echt 1 query uitvoeren die data moet halen uit twee databases.
Dit heb ik nog niet gedaan, sorry
Gewijzigd op 21/09/2012 14:41:55 door Kris Peeters
Ik heb 1 database kp34009_eerste
Daaronder heb ik twee tabellen: pas en pasep
Met 1 query probeer ik alle informatie uit beide tabellen te halen.
Dat doe ik met een INNER JOINS op een kolom met nummers (extra9), maar zowel in pas als in pasep komen verschillende nummers voor, dus met een INNER JOIN is het resultaat negatief.
$query = "SELECT * FROM pas, pasep
INNER JOIN pasep
ON pasep.extra9=pas.extra9
";
Hoe kan ik twee tabellen combineren als de kolom extra9 geen gelijke nummers bevat?
Ik heb het ook op id geprobeerd, maar dan heb ik niet alle informatie, omdat het beide tabellen een ongelijk aantal aangeven.
Moet ik nu in beide tabellen een nieuwe kolom aanmaken met bijvoorbeeld overal een 1 en daar de INNER JOIN op zetten of kan het ook eenvoudiger.
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
SELECT
t1.*,
t2.*
FROM
db1.sometable AS t1
INNER JOIN
db2.someothertable AS t2
ON
t1.anid = t2.anid
t1.*,
t2.*
FROM
db1.sometable AS t1
INNER JOIN
db2.someothertable AS t2
ON
t1.anid = t2.anid
Toevoeging op 21/09/2012 16:30:06:
Nee, je hoeft geen extra kolom te maken. MySQL kent geen FULL JOINS maar dit kan je simuleren door 2 left joins aan elkaar te knopen met UNION, je moet dan wel de kolommen benoemen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT
t1.id,
t1.aname,
t2.title
FROM
table1 AS t1
LEFT JOIN
table2 AS t2
ON t1.extra9 = t2.extra9
UNION DISTINCT
SELECT
t4.id,
t4.aname,
t3.title
FROM
table2 AS t3
LEFT JOIN
table1 AS t4
ON t3.extra9 = t4.extra9
t1.id,
t1.aname,
t2.title
FROM
table1 AS t1
LEFT JOIN
table2 AS t2
ON t1.extra9 = t2.extra9
UNION DISTINCT
SELECT
t4.id,
t4.aname,
t3.title
FROM
table2 AS t3
LEFT JOIN
table1 AS t4
ON t3.extra9 = t4.extra9
Gewijzigd op 21/09/2012 16:35:08 door Ger van Steenderen
Ik heb de namen van de tabellen hieronder ingevuld.
$query = "SELECT
t1.*,
t2.*
FROM
pas AS t1
INNER JOIN
pasep AS t2
ON
pas.extra9 = pasep.extra9
Maar het resultaat blijft nog leeg.
Zie boven
Maar ik kan maar 1 kolom laten zien, terwijl ik er meer wil laten zien.
Ik kan er geen kolomnamen bij zetten, want dan krijg ik een lege query.
En verder
Kan ik er nu nog een INNER JOIN onder zetten of moet het een INNER JOIN worden waarbij de dubbele LEFT JOIN ingebed is?
Gewijzigd op 21/09/2012 20:07:53 door Dick Tol
Als je kolommen met dezelfde benaming wilt tonen moet je één van de twee een alias geven. Daarom is een SELECT * in combinatie met joins zeer onverstandig, en zal ook niet kunnen in union tenzij de twee tabellen exact hetzelfde zijn, maar dan heb je ook geen left join nodig.
Bij de INNER JOIN zal ik de left join in een subquery zetten.
Maar ik krijg de kolomnamen niet in de query.
De tabellen hebben exact dezelfde kolomnamen, maar met andere gegevens, de * werkt inderdaad niet.
Ik wil graag een lijst met kolomnamen maken, maar ik wil de kolomnamen liever niet veranderen, anders haal ik wel erg veel werk op mijn hals.
Hoe maak je snel een alias? Moet ik elke kolom een AS geven?
Gewijzigd op 21/09/2012 22:51:26 door Dick Tol
Wat is nu je query?
SELECT
t1.pasid,
t1.negentiende,
t2.optie8
FROM
pas AS t1
LEFT JOIN
pasep AS t2
ON t1.extra9 = t2.extra9
UNION DISTINCT
SELECT
t4.optie8,
t4.negentiende,
t3.pasid
FROM
pasep AS t3
LEFT JOIN
pas AS t4
ON t3.extra9 = t4.extra9
Maar wat ik me afvraag is wat nu het verschil is tussen beide tabellen, want het lijkt erop dat ze elkaars supplement zijn.
De beide tabellen zijn inderdaad exact gelijk aan elkaar. Alleen de gegevens verschillen.
SELECT
t1.pasid,
t1.negentiende,
t1.optie8,
t2.pasid,
t2.negentiende,
t2.optie8
FROM
pas AS t1
LEFT JOIN
pasep AS t2
ON t1.extra9 = t2.extra9
UNION DISTINCT
SELECT
t4.pasid,
t4.negentiende,
t4.optie8,
t3.pasid,
t3.negentiende,
t3.optie8
FROM
pasep AS t3
LEFT JOIN
pas AS t4
ON t3.extra9 = t4.extra9
Gewijzigd op 22/09/2012 13:54:36 door Dick Tol
Dan zal ik mijn vraag anders stellen; Is het zo dat dezelfde pasid in beide tabellen kunnen voorkomen? Want zo niet, dan kan je het met alleen een UNION af.
Maar als ik de query van 22/09/2012 12:45:06 (zie hierboven) invoer, krijg ik de gegevens van 'negentiende' wel te zien, terwijl ik 'optie8' niet zie.
In beide tabellen komen dezelfde pasid voor, zij het dat in 'pas' in deze kolom veel meer nummers staan dan in 'pasep'.
Ik heb 'extra9' bij ON gezet, omdat in deze kolom de nummers van 'pas' en van 'pasep' totaal verschillen, er zijn hierin geen overeenkomsten.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
SELECT
pas.pasid,
pas.negentiende,
pas.optie8,
pasep.pasid ep_id,
pasep.negentiende ep_negentiende,
pasep.optie8 ep_optie8
FROM
pas
LEFT JOIN
pasep
ON pas.extra9 = pasep.extra9
UNION DISTINCT
SELECT
pas.pasid,
pas.negentiende,
pas.optie8,
pasep.pasid ep_id,
pasep.negentiende ep_negentiende,
pasep.optie8 ep_optie8
FROM
pasep
LEFT JOIN
pas
ON pas.extra9 = pasep.extra9
pas.pasid,
pas.negentiende,
pas.optie8,
pasep.pasid ep_id,
pasep.negentiende ep_negentiende,
pasep.optie8 ep_optie8
FROM
pas
LEFT JOIN
pasep
ON pas.extra9 = pasep.extra9
UNION DISTINCT
SELECT
pas.pasid,
pas.negentiende,
pas.optie8,
pasep.pasid ep_id,
pasep.negentiende ep_negentiende,
pasep.optie8 ep_optie8
FROM
pasep
LEFT JOIN
pas
ON pas.extra9 = pasep.extra9
Blijft natuurlijk wel staan dat je iets vreemds doet in de opzet van de tabellen.
Gewijzigd op 22/09/2012 15:16:50 door Ger van Steenderen
Maar ... het werkt prima! Ik krijg zowel negentiende als optie8 op het scherm te zien.
Nu ga ik de andere kolommen op dezelfde manier erin zetten en daarna heb ik nog een INNER JOIN nodig op een tabel 'lijst'. Op de manier zoals ik het nu wil, lukt het niet.
Als je een tip hebt, graag.
SELECT * FROM pas, pasep
INNER JOIN lijst
ON pas.extra9=lijst.leer
WHERE extra9 IN (
SELECT
pas.pasid,
pas.negentiende,
pas.optie8,
pasep.pasid ep_id,
pasep.negentiende ep_negentiende,
pasep.optie8 ep_optie8
FROM
pas
LEFT JOIN
pasep
ON pas.extra9 = pasep.extra9
UNION DISTINCT
SELECT
pas.pasid,
pas.negentiende,
pas.optie8,
pasep.pasid ep_id,
pasep.negentiende ep_negentiende,
pasep.optie8 ep_optie8
FROM
pasep
LEFT JOIN
pas
ON pas.extra9 = pasep.extra9)
Dat komt met name omdat je geen informatie geeft, en een query is geen informatie, want in dit geval kan ik alleen maar raden hoe de relaties tussen de tabellen zijn.
En dat kost mij ook te veel moeite.
In de tabel 'lijst' staan de unieke nummers van alle recente deelnemers in de kolom 'leer'.
In de tabel 'pas' staat informatie over de deelnemers waarvan de informatie getoond moet worden en over vroegere deelnemers waarvan de informatie niet getoond mag worden. De unieke nummers van deze deelnemers staan in de kolom extra9.
Tabel 'pasep' geeft ook deze informatie, maar daar staan weer andere deelnemers in. De unieke nummers hiervan staan ook in extra9
De tabelen 'pas' en 'pasep' zijn met een UNION verbonden.
Nu wil ik uit deze UNION alleen de informatie van degenen printen die ook in 'lijst' staan.
Ik dacht dit te doen door eerst de INNER JOIN te maken en dan de UNION in een subquery te zetten, maar vanwege de UNION kan ik de kolom 'leer' niet meer via ON met 1 kolom verbinden. Nu moet ik 'leer' koppelen aan twee kolommen 'extra9' (van pas en pasep). Is hier een oplossing voor?
Je gebruikt ook van die nietszeggende benamingen voor je tabellen en kolommen, zodat het voor een buitenstaander absoluut onduidelijk is wat je aan het doen bent.
Als je bv een kolom hebt waarop je een deelnemer identificeert dan noem kolom deelnemer_id en geen extra9, en die kolom heet in alle andere tabellen exact hetzelfde.
Met een JOIN voeg je kolommen en rijen uit verschillende tabellen samen en met een UNION alleen de rijen. In dit geval kan je met UNION volstaan, die zet je in een subquery en die JOIN je dan aan lijst:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
SELECT
lijst.naam,
lijst.titel,
pp.pasid,
pp.negentiende,
pp.optie8
FROM
lijst
INNER JOIN
(SELECT
extra9,
pasid,
negentiende,
optie8
FROM
pas
WHERE optie8 = 3
UNION ALL
SELECT
extra9,
pasid,
negentiende,
optie8
FROM
pasep
WHERE optie8 = 3
) AS pp
ON
lijst.leer = pp.extra9
WHERE lijst.something = 'ets'
lijst.naam,
lijst.titel,
pp.pasid,
pp.negentiende,
pp.optie8
FROM
lijst
INNER JOIN
(SELECT
extra9,
pasid,
negentiende,
optie8
FROM
pas
WHERE optie8 = 3
UNION ALL
SELECT
extra9,
pasid,
negentiende,
optie8
FROM
pasep
WHERE optie8 = 3
) AS pp
ON
lijst.leer = pp.extra9
WHERE lijst.something = 'ets'
Ik heb even wat fictieve filters erop gezet, zodat je kunt zien waar je die moet toepassen (indien nodig).
En geen SELECT * gebruiken, maar netjes de kolommen die je nodig hebt in het resultaat in een SELECT list zetten, ook al zijn ze dat allemaal.
Gewijzigd op 23/09/2012 08:12:50 door Ger van Steenderen
De code ziet er heel logisch uit, en ik ben het met je eens dat de namen van mijn kolommen erg verwarrend zijn.
En de code werkt!
Gewijzigd op 23/09/2012 13:05:32 door Dick Tol