group by Problem

focus1610

Benutzer
Beiträge
9
Hallo zusammen.
Bin ein Neuling was das Thema mySQL betrifft.
Habe aber meiner Meinung bereits eine ganz gut DB hinbekommen. (Eine Lagerverwaltung mit MS Access als FE)
Jetzt aber bin ich an einem Punkt angekommen, wo ich irgendwie keine Lösung finde.
Vielleicht kann mir jemand helfen.

Ich habe eine Tabelle tbl_scan wo es folgende relevante Felder gibt:
scanID, Fahrgestellnummer, Stellplatz und weitere, die aber hier unrelevant sind.
Es gibt für Fahrgestellnummer mehrere Datensätze.

Dann habe ich eine weitere Tabelle tbl_abrufe wo wiederum das Feld Fahrgestellnummer und auch Stellplatz vorhanden ist.

Ich brauche eine Lösung wo sich das Feld Stellplatz in die Tabelle tbl_abruf aktualisieren lässt.
Ob über ein Event, oder einem Trigger, oder auch nur als Prozedur und ich lass mir die Daten über die Prozedur anzeigen. Das würde mir bereits reichen.

Eine Abfrage zu erstellen wo er mir die max_ScanID gibt für jede Fahrgestellnummer gibt, ist kein Problem.
Habe ich gelöst mit:
Code:
select Max(ScanID) as Max_ScanID, Fahrgestellnummer
from tbl_scan
group by Fahrgestellnummer
Aber hier fehlt mir jetzt das entsprechende Stellplatz Feld.
Wenn ich das im Select mit aufnehmen, geht das ja nicht. In die Group Anweisung auch nicht, denn dann bekomme ich da mehrere Werte.

Also wie schaffe ich es den Eintrag zu bekommen, mit der höchsten ID, um dann das Feld Stellplatz anzuzeigen oder in die andere Tabelle zu speichern.

Ich hoffe ich habe mich verständlich ausgedrückt.

Vielen Dank vorab.

Gruß
Frank
 
Werbung:
Das kann man nicht genau sagen, weil nicht klar ist, in welcher Beziehung scan und abruf stehen.
Was Du brauchst ist wahrscheinlich ein JOIN zwischen scan und abruf.
 
hi dabadepdu,
In den Abrufen kann Fahrzeugstellnummer nur einmal vorkommen.
Also wäre es nach meinen anfänglichen Kenntnissen eine 1 zu n Beziehung. richtig??:)

Ich verstehe allerdings nicht wie mir da ein JOIN hilft. Denn ich will ja nicht ALLE Einträge aus Scan... sondern lediglich den jüngsten Wert.
 
verstehe allerdings nicht wie mir da ein JOIN hilft.

Der Join bringt zu jeder Fahrgestellnummer auch den Stellplatz. Das ist alles.

So ungefähr
Code:
select Max(s.ScanID) as Max_ScanID, s.Fahrgestellnummer, a.stellplatz
from tbl_scan s join tbl_abruf a
on s.fahrgestellnummer = a.fahrgestellnummer
group by s.Fahrgestellnummer, a.stellplatz
[code]
 
ah verstehe was du meinst.
Kann morgen erst testen...
Aber dadurch würde ich den Stellplatz aus der Tabelle abruf doch bekommen oder nicht?
Ich brauche aber den Stellplatz aus der Tabelle Scan
 
Lies mir keine Ruhe. Deswegen extra nochmal Rechner an...
Habe es genau umgesetzt wie von dir angegeben.
Dann bekomme ich aber je Fahrgestellnummer mehrere Datensätze angezeigt. Genau die Anzahl an Datensätze ich auch in der Tabelle abruf je Fahrgestellnummer vorhanden sind.
 
Kleiner Tipp noch:
Was Du schreibst, ist nicht gerade extrem fokussiert.
Du hast so viele Möglichkeiten mit SQL Dinge auszudrücken, allein die Table Create Scripte würden schon helfen, wenn Du sie verrätst. Was sind Primärschlüssel, was sind Fremdschlüssel? Wenn das nicht reicht, ein paar Beispieldaten.
 
Mir ist nicht ganz klar ob der Stellplatz nicht einfach redundant ist und deine Probleme daraus resultieren. Ich weiß nicht genau was ein "Scan" und ein "Abruf" ausdrückt, ich weiß nur, das es um Fahrzeuge geht. Normalerweise würde ich sagen die Fahrgestellnummer ist immer eindeutig, und damit ein Schlüsselkandidat. Ein Stellplatz kann sich ändern, aber ein Stellplatz kann immer nur einen Fahrzeug gleichzeitig aufnehmen. (Es sei denn natürlich du nennst nur einen gesamten Parkplatz...) Ohne Tabellen- und Schlüssel-Definition und ohne ein Verständnis für die Daten ist das schwer zu beurteilen.

Auch schreibst du Access als Front End, ist MySQL oder MariaDB wirklich das DBMS dahinter? Ist jetzt hier noch nicht relevant, die Joins bzw. GROUP BY funktioniert genauso.
 
@dabadepdu
Ich brauche je Eintrag aus der Tabelle Abruf DEN Wert des Stellplatze aus der Tabelle Scan welche die höchste ScanID Wert aufweist.

@ukulele
Richtig. Es handelt sich um eine Lagerverwaltung für Fahrzeuge. Und ja. Ein Fahrzeug kann nur einmal vorkommen.
in der Tabelle Abruf werden Datensätze erfasst, wenn ich die Fahrzeuge wieder auslagern soll/will.
Und um diese "Abrufe" abzuarbeiten muss ich wissen, wo dieses Fahrzeug sich befindet.
Der Stellplatz kann sich während der Lagerzeit aber verändern. Da die Fahrzeuge auch gepflegt werden müssen, gehen die Fahrzeuge vom aktuellen Stellplatz runter und werden nach der Pflege nicht unbedingt auf dem vorherigen Stellplatz, sondern eben einem anderen wieder abgestellt.
Daher brauche ich je Abruf(also je Fahrgestellnummer) den aktuellsten Eintrag aus der Tabelle Scan. Und aus diesem Eintrag interessiert mich der Wert des Feldes Stellplatz.

Code:
select Max(a.ScanID) as Max_ScanID, s.Fahrgestellnummer, a.stellplatz
from tbl_abruf s join tbl_scan a
on s.fahrgestellnummer = a.fahrgestellnummer
group by s.Fahrgestellnummer

So eigentlich.
Aber das geht ja nicht, da ich entweder aggregieren muss oder in der Group by Funktion den Stellplatz aufnehmen muss.

Habe es jetzt mit 2 Abfragen versucht. In der ersten Abfrage die höchsten ScanID mit Group by Funktion aus der Tabelle Scan und darauf basierend eine zweite die dann per Join den Stellplatz aus der Tabelle Scan holt.
Aber wenn ich die 2. Abfrage dann ausführen rödelt die DB Sekunden lang, um dann mit Fehler "Error Code: 2013. Lost connection to MySQL server during query" abzubrechen.

Wenn noch jemand Ideen hat...
 
Das ergibt für mich noch keinen Sinn für mich. Was passiert denn, wenn a.stellplatz im GROUP BY steht? Wenn dann mehrere Datensätze pro Fahrzeug erscheinen bedeutet das, das in tbl_scan mehr als ein Eintrag pro Fahrzeug existiert. Was bedeutet ein Eintrag in tbl_scan? Wo ist der Zusammenhang zwischen den Datensätzen wenn in beiden Tabellen mehrere Einträge pro Fahrgestellnummer existieren können, nur über eine aufsteigende, chronologische Datensatz ID?
 
Code:
select a.Fahrgestellnummer, Max(a.ScanID)
from tbl_scan a
group by a.Fahrgestellnummer
Damit bekomme ich je Fahrgestellnummer die höchste ScanID aus der Tabelle Scan. Und das je Fahrgestellnummer. Passt
Ich brauche aber nicht die höchste ID des Fahrzeuges, sondern ich brauche den Stellplatz der in diesem Datensatz steckt.

So geht es nicht. Dann kommt die Fehlermeldung, das nicht aggregiert wird.
Code:
select a.Fahrgestellnummer, Max(a.ScanID), a.Stellplatz
from tbl_scan a
group by a.Fahrgestellnummer

So aber auch nicht. Denn dann bekomme ich NICHT nur einmal die Fahrgestellnummer angezeigt, sondern mehrfach. Nämlich für jeden Eintrag, den er je Fahrgestellnummer in der Tabelle SCAN findet.
Code:
select a.Fahrgestellnummer, Max(a.ScanID), a.Stellplatz
from tbl_scan a
group by a.Fahrgestellnummer, a.Stellplatz

Ich brauche als Ergebnis aber EINEN Eintrag je Fahrgestellnummer woraus ich den Stellplatz Wert benutzen kann.
 
Warum nur noch eine Tabelle?
Die letzte Abfrage könntest Du sortiert ausgeben und den ersten Eintrag nehmen.

Die Abfrage davor ist mit sehr großer Wahrscheinlichkeit falsch und darf man so nie ausführen in mySQL.
 
Werbung:
irgendwie ist die ganze Diskussion für die Tonne. Ideal wären Informationen zum Tabellenaufbau der zwei Tabellen, ein paar Beispieldatensätze und was aufgrund dieser Beispieldatensätze rauskommen soll. Ja, ich weiß, ich bin ein naiver Träumer ...
 
Zurück
Oben