SQL select 3 tabel
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
omdat je alles opvraagt in 1 query, je kan dit over meerdere queryies verdelen of je kan de array opsplitsen
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
;
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
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
;
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
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
Je bent niet helemaal duideijk wat je wilt: je hebt 3 tabellen maar welke informatie wil je daar uit terugkrijgen?
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.
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
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
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.
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?
Erwin, de twee tabellen zijn totaal verschillend, lijkt mij niet dat je dat met een union kan doen.
Maar als je geen info uit beide tabellen nodig hebt om een regel te maken op je pagina, dan is een join onzin.
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.
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
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
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
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
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
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
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
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.
- 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