woher kommt dieser Result
Rolf
- datenbank
0 Vinzenz Mai0 Rolf
Hallo,
ein Query liefert zwar exakte Ergebnisse, aber der erste Record ist Murks:
SELECT c.cID, c.descr, COUNT(o.oID)
FROM objects AS o
LEFT JOIN matrix AS m ON o.oID = m.oID
LEFT JOIN categorie AS c ON c.cID = m.cID
LEFT JOIN kuenstler AS k ON o.kID = k.kID
WHERE o.FG = 'Y' AND k.FG = 'Y'
GROUP BY c.cID ORDER BY c.descr
Mit "Matrix" werden den Objekten Kategorien zugewiesen.
Das Ergebnis sieht wie folgt aus:
Array
(
[0] => Array
( [0] =>
[1] =>
[2] => 1
)
[1] => Array
(
[0] => 2
[1] => Original Grafik
[2] => 214
)
[2] => Array
( [0] => 3
[1] => Skulptur
[2] => 69
)
)
Leider habe ich keine Idee, wie das erste Element entstehen könnte,
weshalb ich auch nicht weiss, wo ich mit der Fehlersuche ansetzen könnte.
Bin für jeden Tip Dankbar ...
m.b.G. Rolf
Hallo,
ein Query liefert zwar exakte Ergebnisse, aber der erste Record ist Murks:
SELECT c.cID, c.descr, COUNT(o.oID)
FROM objects AS o
LEFT JOIN matrix AS m ON o.oID = m.oID
LEFT JOIN categorie AS c ON c.cID = m.cID
LEFT JOIN kuenstler AS k ON o.kID = k.kID
WHERE o.FG = 'Y' AND k.FG = 'Y'
GROUP BY c.cID ORDER BY c.descr
> Das Ergebnis sieht wie folgt aus:
> ~~~php
Array
> (
> [0] => Array
> ( [0] =>
> [1] =>
> [2] => 1
> )
> [1] => Array
> (
> [0] => 2
> [1] => Original Grafik
> [2] => 214
> )
> [2] => Array
> ( [0] => 3
> [1] => Skulptur
> [2] => 69
> )
> )
warum so kompliziert?
also lautet das Ergebnis Deiner Abfrage
cID descr COUNT(o.oID
-------------------------------------
NULL NULL 1
2 Original Grafik 214
3 Skulptur 69
Richtig?
Datenbankmanagementsystem müsste MySQL sein, weil jedes andere mir bekannte DBMS statt eines Resultats einen Syntaxfehler zurückgegeben hätte, es fehlt die Gruppierung nach c.descr. Dies wegzulassen, ändert hier vermutlich nichts am Resultat, da descr von cID, nach dem Du ja gruppierst abhängig sein sollte.
Warum sollte es bei Deinen ganzen Left Joins nicht einen Datensatz in objects geben, für den es keinen passenden Eintrag in Matrix oder Kategorie gibt. Möchtest Du diese Datensätze nicht berücksichtigen, so solltest Du einen INNER JOIN und keinen LEFT JOIN verwenden.
Freundliche Grüße
Vinzenz
Hallo Vinzenz,
also lautet das Ergebnis Deiner Abfrage
cID descr COUNT(o.oID
NULL NULL 1
2 Original Grafik 214
3 Skulptur 69Richtig?
genau!
Das RDBMS ist MySQL 4.0.27 bei 1&1
Warum sollte es bei Deinen ganzen Left Joins nicht einen Datensatz in objects geben,
für den es keinen passenden Eintrag in Matrix oder Kategorie gibt.
weil es kein Objekt ohne Künstler gibt,
irgendwer muss es ja verbrochen haben!
Gleiches gilt für die Kategorien ... eine ist Pflicht, mehrere möglich.
Da ich keinen Shellzugang habe, muss dieses reichen SQL-Tester.
Oben stehen die Results zu den Querys, die unten gelistet werden.
m.b.G. Rolf
Hallo,
also lautet das Ergebnis Deiner Abfrage
cID descr COUNT(o.oID
NULL NULL 1
2 Original Grafik 214
3 Skulptur 69
Das RDBMS ist MySQL 4.0.27 bei 1&1
oh je, die ist ja jenseits von Gut und Böse :-(
Warum sollte es bei Deinen ganzen Left Joins nicht einen Datensatz in objects geben,
für den es keinen passenden Eintrag in Matrix oder Kategorie gibt.
weil es kein Objekt ohne Künstler gibt,
irgendwer muss es ja verbrochen haben!
Gleiches gilt für die Kategorien ... eine ist Pflicht, mehrere möglich.
warum dann LEFT JOIN, nimm doch einfach INNER JOIN.
Da ich keinen Shellzugang habe, muss dieses reichen SQL-Tester.
Oben stehen die Results zu den Querys, die unten gelistet werden.
Wenn Du den Datensatz finden willst, der für die NULL-Werte zuständig ist, dann musst Du auf NULL-Wert prüfen:
SELECT
o.oID,
c.cID
FROM
objects AS o
LEFT JOIN
matrix AS m ON o.oID = m.oID
LEFT JOIN
categorie AS c ON c.cID = m.cID
WHERE
-- c.cID < 1 -- prüft nicht auf NULL
c.cID [link:http://dev.mysql.com/doc/refman/4.1/en/comparison-operators.html#operator_is-null@title=IS NULL] -- Prüfung auf NULL-Wert
Übrigens: Deine WHERE-Klausel im Ausgangsposting sorgt dafür, dass zumindest für objects und kuenstler ein INNER JOIN verwendet wird :-)
Freundliche Grüße
Vinzenz
Hallo Vinzenz,
zuerst mal vielen Dank für Deine Hilfe - aber:
Übrigens: Deine WHERE-Klausel im Ausgangsposting sorgt dafür, dass
zumindest für objects und kuenstler ein INNER JOIN verwendet wird :-)
bei anderen RDBMS vielleicht,
lt. MySQL-Doku existiert kein INNER JOIN, er wird IMHO auf LEFT JOIN gemappt.
D.h. was man schreibt ist das eine, was MySQL daraus macht etwas anderes ... ;-)
Dass ich nie auf NULL teste kommt daher, dass in den CREATE-Statements,
in jedem Feld NOT NULL notiert wird und somit eigentlich gar nicht
auftreten sollte, oder wie ... <grübel>
Trotzdem habe ich Dank Deiner Hilfe den Fehler gefunden und beseitigt,
und morgen wird der Dateneinträger zur Schnecke gemacht ... ;-)
m.b.G. Rolf
Hello,
lt. MySQL-Doku existiert kein INNER JOIN, er wird IMHO auf LEFT JOIN gemappt.
ähm, WAS??
MySQL ist ab Werk speziell in älteren Versionen etwas SQL-Defekt, aber auch nicht so sehr...
MfG
Rouven
Hallo Rouven,
ähm, WAS??
MySQL ist ab Werk speziell in älteren Versionen etwas SQL-Defekt, aber auch nicht so sehr...
hmm,
ich habe mich ja auch nicht beschwert ... ;-)
Aber solange ich weder Japanese, Portuguese und English gleich gar nicht verstehe,
muss ich mich am einzigen deutschen Manual das ich kenne, festhalten.
Und da steht, ziemlich weit unten, was alles nur wegen der Kompatibilität verwendbar ist.
Da bleibt nicht wirklich viel übrig ... ;-)
m.b.G. Rolf