| 

.NET C# Java Javascript Exception

3
Hallo,

ich habe hier ein Problem mit einer Abfrage die seltsame Werte liefert.
Ich habe Maschinendaten (Produktion) und wollte mir die aus der Datenbank auslesen. Jedoch vervielfacht die Abfrage die Ergebnisse nach einem bestimmten Prinzip.

An einem Tag wurden 10 Eintragungen an 5 Maschinen gemacht.
Wenn ich mir die Daten abfrage bekomme ich pro Maschine 10 Eintragungen...

Hier mal die Query:
SELECT distinct
su_count.id, su_count.date, su_part.partnr, su_user.username,
su_automat.autonr, su_operation.operationname, su_machine.machinenr,
su_count.total, su_count.io, su_count.deliver
FROM su_automat, su_count, su_machine, su_operation, su_part, su_user
where su_count.date='20120105'
ORDER BY su_count.date DESC
;

Problem ist die autonr welche vielfach benutzt wird.

Falls ihr noch mehr Informationen braucht, immer her damit...

Danke schonmal,
Bara
02.02.2012
Barados 288 1 7
4 Antworten
1
Hallo,

das Problem wird Deine JOIN-Bedingung sein, da du jede Tabelle mit jeder joinst. Probier mal die "FROM"-Bedingung nach folgendem Schema anzupassen:

SELECT distinct
su_count.id, su_count.date, su_part.partnr, su_user.username,
su_automat.autonr, su_operation.operationname, su_machine.machinenr,
su_count.total, su_count.io, su_count.deliver
FROM su_automat,
LEFT JOIN su_count ON su_automat.id = su_count.automat_id
LEFT JOIN su_machine ON su_count.xxx = su_machine.yyy
....
....
where su_count.date='20120105'
ORDER BY su_count.date DESC
;


Du musst also definitiv wissen wie die Tabellen zusammenhängen, und über diesen Pfad musst Du diese dann verknüpfen.
02.02.2012
SensenMannLE 1,2k 2 9
2
Hi,
das liegt an den bedingungslosen JOINS. Das heißt er verknüpft alle Einträge aller Tabellen untereinander.

Lösung 1: Verwende Richtige JOINS mit einem ON.

Lösung 2: Schreibe die JOIN-Bedingungen als WHERE.
02.02.2012
LiRo 1,3k 1 9
1
Du benutzt den alten Join Syntax ohne sämtlichen Joinbedingungen in die Whereklausen aufzunehmen.

SELECT distinct
su_count.id, su_count.date, su_part.partnr, su_user.username,
su_automat.autonr, su_operation.operationname, su_machine.machinenr,
su_count.total, su_count.io, su_count.deliver
FROM su_automat, su_count, su_machine, su_operation, su_part, su_user
where su_count.date='20120105'
/*
hier müssen die Beziehungen zwischen su_automat, su_count, su_machine, su_operation,
su_part und su_user definiert werden
z.B.:
and su_automat.autonr = su_count.autonr //oder so änlich
and su_automat.machinenr = su_machine.id //oder so änlich
*/
ORDER BY su_count.date DESC
;


Besser wäre es natürlich wäre es besser den modereneren JOIN-Syntax zu verwenden:

SELECT distinct
su_count.id, su_count.date, su_part.partnr, su_user.username,
su_automat.autonr, su_operation.operationname, su_machine.machinenr,
su_count.total, su_count.io, su_count.deliver
FROM su_automat
join su_count ON su_automat.autonr = su_count.autonr
join su_machine ON su_automat.machinenr = su_machine.id
join su_operation ON ...
join su_part ON ...
join su_user ON ...
where su_count.date='20120105'
ORDER BY su_count.date DESC
;

Dieser Syntax ist besser zu lesen und zu warten weil die Beziehungen zwischen den Tabellen deutlicher sichtbar sind.
02.02.2012
Floyd 14,6k 3 9
Floyd 14,6k 3 9
0
Herzlichen Dank die Herren,

hat mir wunderbar geholfen.
Jetzt sieht das so aus
SELECT  su_count.date, su_count.id, su_automat.autonr, su_machine.machinenr, su_user.lastname, 
su_part.partnr, su_operation.operationname, su_count.total, su_count.io, su_count.descr
FROM
((((
su_count INNER JOIN su_automat ON su_count.autoID = su_automat.id
)
INNER JOIN su_machine ON su_count.ma = su_machine.ID
)
INNER JOIN su_user ON su_count.userid = su_user.id
)
INNER JOIN su_operation ON su_count.wpart = su_operation.ID
)
INNER JOIN su_part ON su_count.artnr = su_part.ID
where su_count.date="20120105" and su_count.deliver="1"
order by su_count.artnr desc
;


und tut was es soll. Damit stimmen die Werte überein.

Grüße
Bara
02.02.2012
Barados 288 1 7
Für MySQL brauchst du die vielen runden Klammern nicht.
LiRo 02.02.2012
4
Dann solltest Du bitte auch "zum Abschluss" die Antwort der anderen, die Dir am besten geholfen hat, auch als "Antwort" kennzeichnen!
Xantiva 02.02.2012
getan...

ich dachte mit dem hoch klicken wäre das erledigt...

grüße
Barados 02.02.2012

Stelle deine Sql-Frage jetzt!