Gegevens selecteren van 2 databases

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Dick Tol

Dick Tol

21/09/2012 14:04:52
Quote Anchor link
Kun je de gegevens van 2 databases met een query op je scherm krijgen?

Ik werk met PHPMyAdmin en maak contact met mijn database via het volgende connect-bestandje

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
?>


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.
 
PHP hulp

PHP hulp

29/03/2024 13:17:26
 
Kris Peeters

Kris Peeters

21/09/2012 14:38:44
Quote Anchor link
Heb je twee databases nodig om 1 query uit te voeren?
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
 
Dick Tol

Dick Tol

21/09/2012 16:14:38
Quote Anchor link
Ik zie dat mijn vraag niet goed geformuleerd is.

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.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

21/09/2012 16:18:04
Quote Anchor link
Ja hoor dat kan, met een join of een union, je gebruikt dan gewoon de fully qualified namen van de tabellen, e.g. :
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


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)
PHP script in nieuw venster Selecteer het PHP script
1
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
Gewijzigd op 21/09/2012 16:35:08 door Ger van Steenderen
 
Dick Tol

Dick Tol

21/09/2012 16:33:32
Quote Anchor link
Dank je wel.

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.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

21/09/2012 16:36:07
Quote Anchor link
Zie boven
 
Dick Tol

Dick Tol

21/09/2012 17:03:21
Quote Anchor link
De query werkt prima. Hartelijk dank!

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
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

21/09/2012 20:38:14
Quote Anchor link
Als je nog een andere tabel wilt joinen en daat een INNER JOIN moet zijn, dan zet je de gehele query met de left join als subquery in de inner join (anders worden de left joins ook inner joins).

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.
 
Dick Tol

Dick Tol

21/09/2012 22:49:52
Quote Anchor link
Dank je wel.

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
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

22/09/2012 09:06:06
Quote Anchor link
Hoe bedoel je dat je de kolomnamen niet in de query krijgt?
Wat is nu je query?
 
Dick Tol

Dick Tol

22/09/2012 12:45:06
Quote Anchor link
Dit is mijn query. Alleen 'negentiende' doet het. Als ik er meer kolomnamen in wil zetten, krijg ik een leeg veld.

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
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

22/09/2012 13:45:45
Quote Anchor link
Die query is niet leeg, maar geeft een foutmelding, in beide SELECTs moet je de kolommen in dezelfde volgorde opsommen.

Maar wat ik me afvraag is wat nu het verschil is tussen beide tabellen, want het lijkt erop dat ze elkaars supplement zijn.
 
Dick Tol

Dick Tol

22/09/2012 13:54:13
Quote Anchor link
Als ik de kolommen in dezelfde volgorde opsom, krijg ik een leeg veld te zien (zie hieronder).

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
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

22/09/2012 14:21:03
Quote Anchor link
Probeer eens wat duidelijker te zijn, krijg je een foutmelding (als je de query in PHPMyAdm uitvoert)? Zo niet, veld blijft leeg? Want door de LEFT JOIN kan je dus lege velden krijgen.

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.
 
Dick Tol

Dick Tol

22/09/2012 14:29:59
Quote Anchor link
Als ik de bovenstaande query uitvoer krijg ik geen foutmelding. De tabellen waar de gegevens in horen te staan, verschijnen normaal op het scherm. Er staan alleen geen gegevens in.

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.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

22/09/2012 15:15:16
Quote Anchor link
Probeer dit eens
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
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

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
 
Dick Tol

Dick Tol

22/09/2012 16:04:01
Quote Anchor link
Ik realiseer me dat het vreemd is, maar ik heb het jaren geleden zo opgebouwd en het kost me erg veel moeite om alle verwijzingen deze tabellen te gaan veranderen.

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)
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

22/09/2012 18:01:21
Quote Anchor link
Sorry dat ik het zeggen moet, maar hoe wil jij nu met zo'n zootje nog een logisch geheel bij elkaar krijgen. Mij lukt het iig niet.
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.
 
Dick Tol

Dick Tol

22/09/2012 20:15:58
Quote Anchor link
Er zijn drie tabellen: lijst, pas en pasep.

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?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

23/09/2012 08:11:20
Quote Anchor link
Als je deze informatie eerder gegeven had, waren we gisteren al klaar geweest.
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)
PHP script in nieuw venster Selecteer het PHP script
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
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'

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
 
Dick Tol

Dick Tol

23/09/2012 09:26:43
Quote Anchor link
Dank je wel.

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
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.