Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Hallo zusammen,

habe hier eine an sich sehr überschaubare Tabelle, die ein Lager für Artikel darstellt:

Tabelle "Lager" mit den Spalten "Artikelnr | Lagerort | Menge"

Das was als SQL-Anfrage an sich gestellt werden soll, ist recht nachvollziehbar, allerdings komme ich immer zur Rückgabe von mehr Zeilen als notwendig (die gesuchten sind immerhin dabei ;) ).

Und nun wollte ich mal fragen, ob jemand weiß, ob man nicht nur auch auf genau die eine zurückgebene Zeile kommen kann, die man am Ende benötigt?

Folgende Anfragen an die Tabelle:

a) Welcher Lagerort lagert am wenigsten Artikel mit der Artikelnr = 123 ?

B) Welche Artikelnr gibt es an mehr als einem Lagerort?

Weiß jemand, ob ich diese Anfragen jeweils mit einem SQL gelöst bekommen kann und wenn ja wie die Statements für a) und B) dann aussehen würden?

Vielleicht isses ja einfach nur trivial und ich hab mich einfach in irgendwas verrannt was die Sache nur unnötig kompliziert und mich den Wald vor lauter Bäumen nciht mehr sehen läßt. :-/

Vielen Dank für Eure Hilfe im Voraus!!!

Grüsse

Flori

  • Autor

Das wollte mir doch jetzt keine Ruhe lassen. ;)

Nach etwas Recherche in der MySQL-Doku und schlichtes rumprobieren hab ich es so wie ich es mir vorstelle.

Für alle die, die mal vor ähnlichen Problemen stehen, hier einfach mal die Statements, die die Anfragen in a) und B) auflösen:

für Anfrage a) :


SELECT lagerort

FROM lager

WHERE artikelnr = 123

AND menge = (SELECT MIN(menge) FROM lager WHERE artikelnr = 1)

Hierbei half folgende Seite aus der MySQL-Doku: "3.6.4. Die Zeilen, die das gruppenweise Maximum eines bestimmten Felds enthalten" -> Link Für Anfrage B) hab ich folgende Lösung:

SELECT artikelnr, COUNT(lagerort) AS cnt

FROM lager

GROUP BY artikelnr

HAVING cnt >1

Auf das HAVING war ich einfach anfangs nicht gekommen. :(

Geholfen hat mir hier folgendes aus der MySQL-Doku: "A.5.4. Probleme mit alias" -> Link

So, das soll nun aber auch für heute reichen. :)

Danke an diejenigen, die sich im Laufe des Tage mit meiner Frage beschäftigt hätten, wenn ich nicht doch selbst auf die Antwort gekommen wäre. ;)

/Flori

ich würde sagen A) ist falsch.

Frage: Welcher Lagerort lagert am wenigsten Artikel mit der Artikelnr = 123 ?

Antwort:

-Suche alle Lager und Mengen von der Artikelnr. 123 auf und gib mir die kleinste Menge.


SELECT lagerort, MIN(Menge)

FROM lager

WHERE Artiekelnr = 123

GROUP BY menge

oder habe ich einen denkfehler ?

  • Autor

Hallo,

also ich habe ja auch ne lange Zeit rumprobiert und ich bin inzwischen sehr sicher, daß es genau das ist was gefragt wurde.


SELECT lagerort

FROM lager

WHERE artikelnr = 123

AND menge = (SELECT MIN(menge) FROM lager WHERE artikelnr = 123)

In meinem Unterselect such ich mir erstmal heraus welches die minimale Menge von Artikel 123 ist. Dann nehme ich diese "menge" und suche nach dem "lagerort", der genau diese menge hat. Um zu vermeiden, daß andere Artikel mit gleicher Menge berücksichtigt werden, ist die artikelnr = 123 nochmal als Bedingung gegeben. So funzt es. :)

SELECT lagerort, MIN(Menge)

FROM lager

WHERE Artiekelnr = 123

GROUP BY menge

Du hingegen gruppierst nach der Menge, so daß Du alle MINs für verschiedene Lager bekommst. D.h. du bekommst einen MIN-Wert für jedes Lager welches den Artikel 123 bevorratet.

Aber wie gesagt, is auf den ersten Versuch hin auch nicht so leicht, da durchzusteigen.

Ich hab in den nächsten Tagen noch ein paar weitere Statements, für die ich vermutlich hier auch noch um Rat fragen werde...um schon mal den nächsten Beitrag anzukündigen. ;)

Antwort:

-Suche alle Lager und Mengen von der Artikelnr. 123 auf und gib mir die kleinste Menge.


SELECT lagerort, MIN(Menge)

FROM lager

WHERE Artiekelnr = 123

GROUP BY menge

oder habe ich einen denkfehler ?

Ja. MIN ist eine Aggregatfunktion und positioniert den Cursor nicht.

SELECT lagerort FROM lager WHERE menge = MIN(menge)

könnte gehen, ohne das jetzt probiert zu haben.

  • Autor

SELECT lagerort FROM lager WHERE menge = MIN(menge)

Habs gerade einfach mal noch probiert und folgende (Fehler-)Meldung unter MySQL erhalten:

"#1111 - Invalid use of group function"

MIN() gehört in die Gruppe der "Funktionen zur Benutzung in GROUP BY-Klauseln" (Kap. 12.11.1. in MySQL-Doku, Vers.5.1)

Viele Grüsse

Flori

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.