[MySQL 5.0.27] Volgorde 'FROM <table names>' van belang?

Pagina: 1
Acties:

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 08-10 13:03
Samenvatting probleem

De volgorde van de tabellen in het FROM-gedeelte van de volgende queries maakt het verschil tussen werken en niet werken.

Werkt wel:

SQL:
1
2
3
SELECT bedrijven.naam
FROM planten, klanten
LEFT JOIN bedrijven ON (klanten.bedrijfID = bedrijven.ID)


Werkt niet:
SQL:
1
2
3
SELECT bedrijven.naam
FROM klanten, planten
LEFT JOIN bedrijven ON (klanten.bedrijfID = bedrijven.ID)


(Foutmelding: #1054 - Unknown column 'klanten.bedrijfID' in 'on clause')

Situatie

Ik heb drie tabellen in mijn DB: bedrijven, klanten en planten.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Bedrijven
+------------+
| ID         |
+------------+
| Naam       |
+------------+

Klanten
+------------+
| bedrijfId  |
+------------+
| Saldo      |
+------------+

Planten
+------------+
| ID         |
+------------+
| Naam       +
+------------+


Klanten.bedrijfId verwijst naar Bedrijven.ID.

Vraag
Is dit een bug of niet? Mij lijkt van wel, ik heb het al met meerdere tabellen geprobeerd...

De volgorde van selecteren moet toch niet uitmaken?

Verwijderd

De volgorde is bij de tabellen normaal niet van belang, maar bij joins wel :).

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 08-10 13:03
Verwijderd schreef op woensdag 28 februari 2007 @ 14:22:
De volgorde is bij de tabellen normaal niet van belang, maar bij joins wel :).
:? Hier heb ik nog nooit van gehoord. Waarom zou die volgorde belangrijk zijn dan?

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Je query ziet er zowiezo niet goed uit.
Je selecteert gegevens uit 3 tabellen, maar je joint slechts 2 tabellen. Wat doet die 'planten' tabel daar trouwens ? Je doet er niets mee ?
(Foutmelding: #1054 - Unknown column 'klanten.bedrijfID' in 'on clause')
Ben je trouwens wel zeker dat je daar een komma staan hebt, tussen die 2 tabellen in je FROM ? Indien daar geen komma staat, zal je DBMS nl. de 2de naam als alias nemen voor je tabelnaam, en moet je dus overal in je query die alias gebruiken ipv je tabelnaam.
Hier heb ik nog nooit van gehoord. Waarom zou die volgorde belangrijk zijn dan?
Dit heeft invloed op left / right joins
code:
1
2
3
select * 
from a 
left join b on ...

zal een ander resultaat hebben dan
code:
1
2
3
select * 
from b
left join a on ...

Bij de eerste query krijg je alle records uit a, ook diegene die geen gerelateerd record hebben in b.
Bij de tweede query krijg je alle records uit b, ook diegene die geen gerelateerd record hebben in a.
Maar, dit is dus eigenlijk icm met je from clause.
En ik geloof ook dat je niet dit kunt doen:
code:
1
2
3
4
select *
from a 
inner join b on b.id = c.id
inner join c on a.id = b.id

Ik denk dat ie daar op de tweede regel zal zeggen dat c niet gekend is.

[ Voor 95% gewijzigd door whoami op 28-02-2007 14:33 ]

https://fgheysels.github.io/


  • Orion84
  • Registratie: April 2002
  • Laatst online: 13:41

Orion84

Admin General Chat / Wonen & Mobiliteit

Fotogenie(k)?

Rekcor schreef op woensdag 28 februari 2007 @ 14:26:
[...]


:? Hier heb ik nog nooit van gehoord. Waarom zou die volgorde belangrijk zijn dan?
Omdat die JOIN operator tussen de twee tabellen staat die je wilt joinen, en niet op een nieuwe regel die lost staat van wat er verder bij de FROM staat gok ik :)

The problem with common sense is that it's not all that common. | LinkedIn | Flickr


  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 08-10 13:03
Rekcor schreef op woensdag 28 februari 2007 @ 14:26:
[...]


:? Hier heb ik nog nooit van gehoord. Waarom zou die volgorde belangrijk zijn dan?
The join optimizer calculates the order in which tables should be joined. The table read order forced by LEFT JOIN or STRAIGHT_JOIN helps the join optimizer do its work much more quickly, because there are fewer table permutations to check.

  • DigiK-oz
  • Registratie: December 2001
  • Laatst online: 26-11 15:50
Zoals je het nu doet (1e query) heb je een cartesisch product tussen planten enerzijds en (klanten
LEFT JOIN bedrijven ON (klanten.bedrijfID = bedrijven.ID)) anderzijds, dus dat werkt wel (al zal het niet zijn wat je zoekt)

De 2e query is een cartesisch product tussen klanten enerzijds en (planten
LEFT JOIN bedrijven ON (klanten.bedrijfID = bedrijven.ID)) anderzijds. Dus die join gaat fout omdat de tabel klanten gewoon geen onderdeel van de join is.

Whatever


  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 08-10 13:03
Sloompie schreef op woensdag 28 februari 2007 @ 14:34:
Zoals je het nu doet (1e query) heb je een cartesisch product tussen planten enerzijds en (klanten
LEFT JOIN bedrijven ON (klanten.bedrijfID = bedrijven.ID)) anderzijds, dus dat werkt wel (al zal het niet zijn wat je zoekt)

De 2e query is een cartesisch product tussen klanten enerzijds en (planten
LEFT JOIN bedrijven ON (klanten.bedrijfID = bedrijven.ID)) anderzijds. Dus die join gaat fout omdat de tabel klanten gewoon geen onderdeel van de join is.
Volgens mij begint het kwartje te vallen. Eigenlijk staat er dus dit:

SQL:
1
2
SELECT bedrijven.naam 
FROM planten, ( klanten LEFT JOIN bedrijven ON (klanten.bedrijfID = bedrijven.ID) )


vs

SQL:
1
2
SELECT bedrijven.naam 
FROM klanten, ( planten LEFT JOIN bedrijven ON (klanten.bedrijfID = bedrijven.ID) )


De tweede werkt niet, slogisch.

  • DigiK-oz
  • Registratie: December 2001
  • Laatst online: 26-11 15:50
Yep. Ik weet niet wat je precies wilt met de query, maar het lijkt me dat je ook nog ergens een relatie (join) wilt hebben met je 3e tabel (planten dus)

Whatever


  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 08-10 13:03
Sloompie schreef op woensdag 28 februari 2007 @ 14:42:
Yep. Ik weet niet wat je precies wilt met de query, maar het lijkt me dat je ook nog ergens een relatie (join) wilt hebben met je 3e tabel (planten dus)
Idd, dit was ff een niet-realistisch voorbeeldje om het probleem duidelijk te maken...
Pagina: 1