SQL select 3 tabel

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Erik waarom

Erik waarom

06/03/2012 20:54:27
Quote Anchor link
Hallo,

Kan iemand me op weg helpen. Ik probeer gegevens uit 3 tabellen te krijgen. Dan wel verdeeld in meerdere rijen. Ik krijg nu alles in 1 rij terug. Kan ik iemand me vertellen wat ik fout doen.

-----voorbeeld
tabel users
id

tabel autos
id
users_id

tabel fiets
id
users_id
--------Als krijg k nu alles in 1 rij.

$sql="select * from (users left join lift on users.id = lift.user_id) left join advertenties on users.id = advertenties.user_id";

bvd
 
PHP hulp

PHP hulp

23/12/2024 06:08:45
 
Reshad F

Reshad F

06/03/2012 21:12:00
Quote Anchor link
omdat je alles opvraagt in 1 query, je kan dit over meerdere queryies verdelen of je kan de array opsplitsen
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

06/03/2012 21:22:05
Quote Anchor link
Je gebruikt haakjes op een verkeerde manier.
Afgezien van het feit dat je andere tabellen in je query hebt dan in je voorbeeld.
En het is ook niet zo slim om * te gebruiken in een SELECT (in het algemeen niet maar zeker niet in joins), want hoe ga je straks opvragen in php als je in 3 tabellen dezelfde veldnamen hebt. Je query moet er dus ongeveeer zo uitzien
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
SELECT
    t1.id AS t1ID,
    t1.name AS t1name,
    t2.id AS t2ID,
    t2.name AS t2Name,
    t3.id AS t3ID,
    t3.name AS t3Name,
FROM
    myusers AS t1
LEFT JOIN
    lift AS t2 ON t1.id = t2.user_id
lEFT JOIN
    advertenties AS t3 ON t1.id = t3.user_id
--hier evntueel nog een WHERE clause
;
Gewijzigd op 06/03/2012 21:33:03 door Ger van Steenderen
 
Erik waarom

Erik waarom

06/03/2012 22:24:19
Quote Anchor link
Ger van Steenderen op 06/03/2012 21:22:05:
Je gebruikt haakjes op een verkeerde manier.
Afgezien van het feit dat je andere tabellen in je query hebt dan in je voorbeeld.
lEFT JOIN
advertenties AS t3 ON t1.id = t3.user_id
--hier evntueel nog een WHERE clause
;



Bedankt voor de reactie. Dit is toch hetzelfde als wat ik had? alleen geef ik de tabellen geen andere naam. Zit daar wel verschil tussen?

Als ik meerdere advertenties heb en bij lift 1 rij, dan werkt het goed. Hoewel ik krijg nog steeds wel 1 regel compleet gevuld, maar wel meerder rijen. Zodra ik 2 rijen in lift tabel heb, gaat het helemaal fout.

Doe ik het fout?Gebruik ik de verkeerde join? normaal doe je select * bla from where en dan met while kan je het per regel gebruiken. Nu word bij elke regel ook de lift gegevens ingevuld.

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
SELECT
    t1.id AS t1ID,
    t1.username as t1Username,
    t2.id AS t2ID,
    t2.datumvertrek AS t2Datumvertrek,
    t2.datumterugreis AS t2Datumaankomst,
    t2.vertrek AS t2Vertrek,
    t2.aankomst AS t2Aankomst,
    t2.via AS t2Via,    
    t2.user_id AS t2Userid,  
    t3.id AS t3ID,
    t3.omschrijving AS t3Omschrijving,
    t3.beschrijving AS t3Beschrijving,
    t3.tekoop AS t3Tekoop,
    t3.prijs AS t3Prijs,
    t3.fotos AS t3Fotos,
       t3.user_id AS t3Userid
FROM
    users AS t1
LEFT JOIN
    lift AS t2 ON t1.id = t2.user_id
LEFT JOIN
    advertenties AS t3 ON t1.id = t3.user_id
 ORDER BY RAND() LIMIT 4
Gewijzigd op 06/03/2012 22:51:46 door Erik waarom
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

06/03/2012 22:43:13
Quote Anchor link
Het ligt eraan wat je wilt joinen. Anders gezegd wat wil je koppelen?
Je bent niet helemaal duideijk wat je wilt: je hebt 3 tabellen maar welke informatie wil je daar uit terugkrijgen?
 
Erik waarom

Erik waarom

06/03/2012 22:50:42
Quote Anchor link
Mijn bedoeling is:
met 1 query de tabellen lift, advertenties en users uit te lezen dan gekoppeld met user id.

Zodat ik met 1 While lus alles kan doorlopen. Dit geval moeten er uiteindelijk 4 random regels zichtbaar worden. Dat kan dus een lift of een advertentie zijn met de daarbij horende user gegevens.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

07/03/2012 08:07:20
Quote Anchor link
Aha ik had de LIMIT niet gezien, wat jij wilt moet je met een subquery doen:
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
    userID,
    username,
    datumvertrek,
        --enzovoort
FROM
    (SELECT
        t1.id AS userID,
            t1.username,
            t2.id AS liftID,
            t2.datumvertrek,
            t2.datumterugreis,
            t2.vertrek,
            t2.aankomst,
            t2.via,
            t3.id AS addID,
            t3.omschrijving,
            t3.beschrijving,
            t3.tekoop,
            t3.prijs,
            t3.fotos
    FROM
            users AS t1
    LEFT JOIN
            lift AS t2 ON t1.id = t2.user_id
    LEFT JOIN
            advertenties AS t3 ON t1.id = t3.user_id)
    AS aView
ORDER BY RAND() LIMIT 4

Je hoeft geen aliassen op kolommen te gebruiken als de kolomnamen verschillen.
Met deze query krijg je trouwens oook de users zonder lift en advertenties.
Reshadd:
omdat je alles opvraagt in 1 query, je kan dit over meerdere queryies verdelen of je kan de array opsplitsen

Verklaar je nader aub.
 
Erwin H

Erwin H

07/03/2012 09:30:31
Quote Anchor link
Ik vraag me alleen af of je hier wel een join nodig hebt tussen de tabellen, of eigenlijk een union? Je zegt namelijk "Dat kan dus een lift of een advertentie zijn". Of, niet en.
Wat is het verband tussen de verschillende tabellen? Heb je bij de lift gegevens ook de advertentie gegevens nodig, of altijd alleen maar of de een, of de ander?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

07/03/2012 09:46:31
Quote Anchor link
Erwin, de twee tabellen zijn totaal verschillend, lijkt mij niet dat je dat met een union kan doen.
 
Erwin H

Erwin H

07/03/2012 09:54:26
Quote Anchor link
Ligt eraan wat de info is die je nodig hebt.
Maar als je geen info uit beide tabellen nodig hebt om een regel te maken op je pagina, dan is een join onzin.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

07/03/2012 10:36:53
Quote Anchor link
Daar heb je ook gelijk in, de gehele query is onlogisch. Ik denk dat het in dit geval het simpelste is om de querie in tweeen op te splitsen, met een union gaat wel maar dan noeten wel alle kolomtypes gelijk zijn of je moet met virtuele kolommen gaan werken.
 
Erik waarom

Erik waarom

07/03/2012 18:00:14
Quote Anchor link
Bedankt voor de reacties.

Ik ben al een stukje wijzer geworden. De gegevens uit de tabellen lift en advertentie hebben relatie met user. Niet met elkaar. Ik zat me blind te staren op de joins, maar nu ik jullie reacties lees word het wat helderder. Nooit over subqueries na gedacht. Met zoeken kwam ik voornamelijk bij de joins terecht.

Als ik het goed heb begrepen koppel je dus de gegevens uit de tabellen met elkaar doormiddel van de left en right join. Daardoor krijg ik dubbele gevevens als resultaat?(1 rij in tabel lift. 3 rijden in tabel ad., bij elke ad met dezelfde user id word lift herhaalt.)

Ik wou zo min mogelijk php gebruiken, maar volgens mij kan ik beter 2 queries draaien met een hogere limit. Vervolgens samen voegen in array daar random 4 uit halen.
Gewijzigd op 07/03/2012 18:21:02 door Erik waarom
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

07/03/2012 19:13:30
Quote Anchor link
Het blijft een beetje onlogisch omdat je twee totaal verschillende tabellen met elkaar wilt verenigen. Maar bijna niets is onmogelijk dus:
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
SELECT k1, k2, k3, k4, k5, k6, k7, k8, type
FROM
    ((SELECT t1.id AS k1, t1.username AS k2, t2.id AS k3,
            CAST(t2.datumvertrek, CHAR) AS k4,
            CAST(t2.datumterugreis, CHAR) AS k5,
            t2.vertrek AS k6,
            t2.aankomst AS k7,
            t2.via AS k8,
        'lift' AS type
    FROM users AS t1
    JOIN lift AS t1 ON t1.id = t2.user_id)
     UNION
    (SELECT t3.id AS k1, t3.username AS k2, t4.id AS k3,
        t4.omschrijving AS k4,
            t3.beschrijving AS k5,
            CAST(t3.tekoop, CHAR) as k6,
            CAST(t3.prijs, CHAR) as k7,
            t3.fotos as k8,
        'add' AS type
    FROM users AS t3
    JOIN advertentie AS t4 ON t1.id = t2.user_id))
    AS t213754
ORDER BY RAND() LIMIT 4

beetje smerig maar zou moeten werken (niet uitgetest)
Gewijzigd op 07/03/2012 19:14:40 door Ger van Steenderen
 
Erik waarom

Erik waarom

07/03/2012 21:24:03
Quote Anchor link
Ger van Steenderen, dankje.

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
SELECT k1, k2, k3, k4, k5, k6, k7, k8, type
FROM
    ((SELECT t1.id AS k1, t1.username AS k2, t2.id AS k3,
            t2.datumvertrek AS k4,
            t2.datumterugreis AS k5,
            t2.vertrek AS k6,
            t2.aankomst AS k7,
            t2.via AS k8,
        'lift' AS type
    FROM users AS t1
    JOIN lift AS t2 ON t1.id = t2.user_id)
     UNION
    (SELECT t3.id AS k1, t3.username AS k2, t4.id AS k3,
        t4.omschrijving AS k4,
            t4.beschrijving AS k5,
            t4.tekoop as k6,
            t4.prijs as k7,
            t4.fotos as k8,
        'add' AS type
    FROM users AS t3
    JOIN advertenties AS t4 ON t4.user_id = t3.id))
    AS t213754
ORDER BY RAND() LIMIT 4


Ik heb het bijna werkend//// hoe hoe, het werkt nu. Wat cool, Ik snap alleen de query nog niet helemaal. Ga nu ff de hele query uit pluizen.

Het kan dus wel:), wat is nu verstandiger? PHP en meerdere queries, of een ingewikkelde(voor mij doen) query met union? Ik had gelezen dat Union best wel veel van de server vraagt. Is dat echt merkbaar?
Gewijzigd op 07/03/2012 21:36:43 door Erik waarom
 
Erwin H

Erwin H

07/03/2012 23:50:10
Quote Anchor link
Dat ligt aan de opbouw van je tabel en van je query. Als je goede indices hebt op je tabel dan kan een union bijzonder snel zijn. En vergeet niet dat je aan de andere kant (als je geen union gebruikt) ook twee keer je database aan moet spreken, wat ook weer extra resources vergt. Een simpel antwoord is dus niet te geven, in de trant van "dit of dat is beter", je zal zelf moeten zien hoe het in de praktijk zich houdt.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

08/03/2012 13:10:54
Quote Anchor link
Er zijn een aantal voorwaarden verbonden aan een union:
- het aantal kolommen moet gelijk zijn
- de kolomnamen moeten hetzelfde zijn

De laatste is op te lossen met aliassen. Ik dacht dat ze ook hetzelfde datatype moesten hebben, maar dat is dus niet zo. Dan is het gelijk een stuk minder smerig :->
Quote:
Het kan dus wel:), wat is nu verstandiger? PHP en meerdere queries, of een ingewikkelde(voor mij doen) query met union? Ik had gelezen dat Union best wel veel van de server vraagt. Is dat echt merkbaar?

In dit geval vind ik de oplossing met 1 query het beste: als je met 2 queries eerst een aantal rijen gaat ophalen en daarna in php een hoop fratsen uit moet halen om er uiteindelijk maar 4 over te houden is niet zo slim.
Gewijzigd op 08/03/2012 13:11:45 door Ger van Steenderen
 



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.