MySQL 5 will meine Query nicht mehr

MySQL 5 will meine Query nicht mehr

am 30.12.2006 20:09:16 von Christian Ratsch

Moin,

mit MySQL 3.21 funktioniert folgendes Statement wunderbar, jedoch mit
MySQL 5.0.24a (von XAMPP) gibt es den Fehler 1054 "Unknown column
'fahrt.start' in 'on clause'". Wie muss ich folgendes Statement
verändern, damit es funktioniert?

SELECT
fahrt.datum AS datum,
city1.name AS start,
city2.name AS wp1,
city3.name AS wp2,
city4.name AS ziel
FROM
fahrt
LEFT JOIN city AS city1 ON city1.id =3D fahrt.start
LEFT JOIN city AS city2 ON city2.id =3D fahrt.wp1
LEFT JOIN city AS city3 ON city3.id =3D fahrt.wp2
LEFT JOIN city AS city4 ON city4.id =3D fahrt.ziel
WHERE
fahrt.datum >=3D NOW()
AND fahrt.geloescht =3D 0
ORDER BY
fahrt.datum,
fahrt.zeit
LIMIT 0, 20

(Zum Verständnis: Es geht hier um Fahrt-Routen aus einer Datenbank mit
bis zu 2 Zwischenstationen. Ich will Datum der Fahrten und Namen der
Wegpunkte auslesen).

Für Eure Hilfe wäre ich sehr dankbar, weil ich selber etwas
überfragt bin. Vielen Dank!

Gruß
C R.

Re: MySQL 5 will meine Query nicht mehr

am 30.12.2006 20:22:53 von Johannes Vogel

HI Christian

Christian Ratsch wrote:
> mit MySQL 3.21 funktioniert folgendes Statement wunderbar, jedoch mit
> MySQL 5.0.24a (von XAMPP) gibt es den Fehler 1054 "Unknown column
> 'fahrt.start' in 'on clause'". Wie muss ich folgendes Statement
> verändern, damit es funktioniert?

Scheint so, als wäre die Tabelle fahrt nicht vollständig übertragen
worden. Schau mal `desc fahrt`, ob start als Attribut noch vorhanden ist.

HTH, Johannes

Re: MySQL 5 will meine Query nicht mehr

am 30.12.2006 20:43:54 von Robert Bollig

Hallo !

Leider kenn ich den Lösungslink nicht, weil ich grad nicht hier habe,
aber..es hat was mit der neuen Interpretation der JOINS zu tun.

mysql5 verarbeitet diese anders - ggf./bzw. Ergänzend sind es Klammern, die
nun die "Reihenfolge" der Joins sicherstellen, damit eben dieser Fehler
nicht auftaucht.

Ich schau mal ob ich den Link finde, oder aber dann morgen im Office, dort
liegt er auf nem Rechner.

Gruß und so, Robert

Re: MySQL 5 will meine Query nicht mehr

am 30.12.2006 22:23:47 von Dominik Echterbruch

Robert Bollig wrote:
>
> Leider kenn ich den Lösungslink nicht, weil ich grad nicht hier habe,
> aber..es hat was mit der neuen Interpretation der JOINS zu tun.

Das denke ich nicht. Ich glaube, was du meinst, ist die unterschiedliche
Priorisierung von , und JOIN. Da der OP aber ausschließlich LEFT JOIN
verwendet hat, dürfte sich MySQL daran nicht aufhängen (und tut das auch
nicht, wie aus meiner Antwort an den OP zu ersehen).

Grüße,
Dominik
--
Norbert Melzer in d.c.d.mysql:
F: Wie verstehe ich diese FAQ am besten?
A: Studieren Sie Datanbank-Design und lesen Sie anschliessend alles nochmal

Re: MySQL 5 will meine Query nicht mehr

am 30.12.2006 22:29:11 von Dominik Echterbruch

Christian Ratsch wrote:
>
> mit MySQL 3.21 funktioniert folgendes Statement wunderbar, jedoch mit
> MySQL 5.0.24a (von XAMPP) gibt es den Fehler 1054 "Unknown column
> 'fahrt.start' in 'on clause'". Wie muss ich folgendes Statement
> verändern, damit es funktioniert?
>
> SELECT
> fahrt.datum AS datum,
> city1.name AS start,
> city2.name AS wp1,
> city3.name AS wp2,
> city4.name AS ziel
> FROM
> fahrt
> LEFT JOIN city AS city1 ON city1.id = fahrt.start
> LEFT JOIN city AS city2 ON city2.id = fahrt.wp1
> LEFT JOIN city AS city3 ON city3.id = fahrt.wp2
> LEFT JOIN city AS city4 ON city4.id = fahrt.ziel
> WHERE
> fahrt.datum >= NOW()
> AND fahrt.geloescht = 0
> ORDER BY
> fahrt.datum,
> fahrt.zeit
> LIMIT 0, 20

Leider hast du uns die CREATE TABLE Statements vorenthalten, also habe
ich mal etwas gebaut, mit dem man die oben stehende Abfrage ausführen kann.

mysql> show create table fahrt \G
*************************** 1. row ***************************
Table: fahrt
Create Table: CREATE TABLE `fahrt` (
`datum` date NOT NULL,
`start` int(10) unsigned NOT NULL,
`wp1` int(10) unsigned NOT NULL,
`ziel` int(10) unsigned NOT NULL,
`geloescht` tinyint(3) unsigned NOT NULL,
`zeit` time NOT NULL,
`wp2` int(10) unsigned NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.03 sec)

mysql> show create table city \G
*************************** 1. row ***************************
Table: city
Create Table: CREATE TABLE `city` (
`id` int(10) unsigned NOT NULL auto_increment,
`name` varchar(255) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

Auf die oben stehende Abfrage hin liefert MySQL brav ein "Empty set
(0.00 sec)", weil ich keine Daten drin habe. Aber die Abfrage
funktioniert einwandfrei.

Ich vermute analog zu Johannes, daß dir irgendwie das Attribut start in
der Tabelle fahrt abhanden gekommen ist. Poste doch mal die CREATE TABLE
Statements der Tabellen, dann sehen wir vielleicht was.

Grüße,
Dominik
--
Norbert Melzer in d.c.d.mysql:
F: Wie verstehe ich diese FAQ am besten?
A: Studieren Sie Datanbank-Design und lesen Sie anschliessend alles nochmal

Re: MySQL 5 will meine Query nicht mehr

am 30.12.2006 22:31:51 von Dominik Echterbruch

Dominik Echterbruch wrote:
> Auf die oben stehende Abfrage hin liefert MySQL brav ein "Empty set
> (0.00 sec)", weil ich keine Daten drin habe. Aber die Abfrage
> funktioniert einwandfrei.

BTW: Getestet mit einem Standalone MySQL 5.0.22 unter Debian. Sollte
aber mit 5.0.24a unter beliebigen OSs nicht anders sein.

Grüße,
Dominik
--
Norbert Melzer in d.c.d.mysql:
F: Wie verstehe ich diese FAQ am besten?
A: Studieren Sie Datanbank-Design und lesen Sie anschliessend alles nochmal

Re: MySQL 5 will meine Query nicht mehr

am 31.12.2006 03:01:17 von Christian Ratsch

Vielen Dank Euch allen, ich habe den Haken mittlerweile selber
gefunden. Das Statement in meinem OP war so weit verkürzt, dass es
auch bei mir dann funktionierte :) (Hatte es im Mailer so geschrieben
und nicht mehr ausprobiert.) Sorry dass ich Euch in die Irre geführt
habe.

Das eigentliche Problem lag, wie ich durch ausprobieren festgestellt
habe, ganz woanders.

MySQL 3 scheint mit Statements der Form

FROM a, b
LEFT JOIN x as y on y.id =3D a.irgendwas

kein Problem zu haben. Für MySQL 5 musste ich es umformulieren:

FROM a
LEFT JOIN x as y on y.id =3D a.irgendwas,
b

Damit funktioniert es dann auch in Version 5. Da soll mal einer drauf
kommen...

Nix für ungut
Christian

Re: MySQL 5 will meine Query nicht mehr

am 31.12.2006 08:23:05 von jan.clauss

Christian Ratsch schrieb:
> Vielen Dank Euch allen, ich habe den Haken mittlerweile selber
> gefunden. Das Statement in meinem OP war so weit verkürzt, dass es
> auch bei mir dann funktionierte :) (Hatte es im Mailer so geschrieben
> und nicht mehr ausprobiert.) Sorry dass ich Euch in die Irre geführt
> habe.
>
> Das eigentliche Problem lag, wie ich durch ausprobieren festgestellt
> habe, ganz woanders.
>
> MySQL 3 scheint mit Statements der Form
>
> FROM a, b
> LEFT JOIN x as y on y.id = a.irgendwas
>
> kein Problem zu haben. Für MySQL 5 musste ich es umformulieren:
>
> FROM a
> LEFT JOIN x as y on y.id = a.irgendwas,
> b
>
> Damit funktioniert es dann auch in Version 5. Da soll mal einer drauf
> kommen...
>
Schade, habe ich das übersehen, oder stand das nicht in Deinem Posting?
Den Fehler hätte ich Dir auf nen Ruck gesagt. Hat mich auch schon
etliches an Zeit gekostet.

Re: MySQL 5 will meine Query nicht mehr

am 31.12.2006 11:01:27 von Mike Lischke

Christian Ratsch wrote:

> Für MySQL 5 musste ich es umformulieren:
>
> FROM a
> LEFT JOIN x as y on y.id = a.irgendwas,
> b
>
> Damit funktioniert es dann auch in Version 5. Da soll mal einer drauf
> kommen...

Also war es doch das "Komma Join" Problem, wie es Robert schon vermutet
hatte. Näheres dazu hier:
http://dev.mysql.com/doc/refman/5.0/en/join.html. Insbesondere dieser
Absatz:


INNER JOIN and , (comma) are semantically equivalent in the absence
of a join condition: both produce a Cartesian product between the
specified tables (that is, each and every row in the first table is
joined to each and every row in the second table).

However, the precedence of the comma operator is less than than of
INNER JOIN, CROSS JOIN, LEFT JOIN, and so on. If you mix comma joins
with the other join types when there is a join condition, an error of
the form Unknown column 'col_name' in 'on clause' may occur.


Mike
--
www.mysql.com

Re: MySQL 5 will meine Query nicht mehr

am 31.12.2006 11:32:59 von Harald Fuchs

In article ,
"Mike Lischke" writes:

> Christian Ratsch wrote:
>> Für MySQL 5 musste ich es umformulieren:
>>
>> FROM a
>> LEFT JOIN x as y on y.id =3D a.irgendwas,
>> b

> ...

> However, the precedence of the comma operator is less than than of
> INNER JOIN, CROSS JOIN, LEFT JOIN, and so on. If you mix comma joins
> with the other join types when there is a join condition, an error of
> the form Unknown column 'col_name' in 'on clause' may occur.

Wodurch deutlich wird, daß Christians "Lösung" zwar funktioniert, aber
dasselbe durch einen INNER JOIN nicht nur klarer, sondern auch
portabler ausgedrückt wird.

Re: MySQL 5 will meine Query nicht mehr

am 31.12.2006 14:36:32 von Robert Bollig

"Mike Lischke" schrieb...

> Also war es doch das "Komma Join" Problem, wie es Robert schon vermutet
> hatte. Näheres dazu hier:
> http://dev.mysql.com/doc/refman/5.0/en/join.html. Insbesondere dieser
> Absatz:
>
>
> INNER JOIN and , (comma) are semantically equivalent in the absence
> of a join condition: both produce a Cartesian product between the
> specified tables (that is, each and every row in the first table is
> joined to each and every row in the second table).
>
> However, the precedence of the comma operator is less than than of
> INNER JOIN, CROSS JOIN, LEFT JOIN, and so on. If you mix comma joins
> with the other join types when there is a join condition, an error of
> the form Unknown column 'col_name' in 'on clause' may occur.
>


Vielen Dank für die Blumen, Mike.

Ich komm ja mehr aus der MS-Ecke...daher bin ich es gewohnt, dass die
Fehlermeldung meist nicht zum Problem, geschweige denn zur Ursache führt
;-))

Guten Rutsch euch allen, Robert

Re: MySQL 5 will meine Query nicht mehr

am 31.12.2006 15:17:39 von Dominik Echterbruch

Robert Bollig wrote:
>
> Ich komm ja mehr aus der MS-Ecke...daher bin ich es gewohnt, dass die
> Fehlermeldung meist nicht zum Problem, geschweige denn zur Ursache führt
> ;-))

Amen! ;)

Grüße,
Dominik
--
Norbert Melzer in d.c.d.mysql:
F: Wie verstehe ich diese FAQ am besten?
A: Studieren Sie Datanbank-Design und lesen Sie anschliessend alles nochmal