Flori Geschrieben 7. Januar 2007 Teilen Geschrieben 7. Januar 2007 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 ? 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 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Flori Geschrieben 7. Januar 2007 Autor Teilen Geschrieben 7. Januar 2007 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 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 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
baba007 Geschrieben 8. Januar 2007 Teilen Geschrieben 8. Januar 2007 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 ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Flori Geschrieben 8. Januar 2007 Autor Teilen Geschrieben 8. Januar 2007 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 8. Januar 2007 Teilen Geschrieben 8. Januar 2007 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Flori Geschrieben 8. Januar 2007 Autor Teilen Geschrieben 8. Januar 2007 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.