Verschachtelte SQL-Statements

visiondpc

Erfahrenes Mitglied
Hallo, ich steh grade etwas auf dem Schlauch.

Ich habe in einer MySQL Datenbank eine Tabelle mit Artikeln. Für jeden Artikel kann ein Mindestbestand in dieser Tabelle hinterlegt werden.
In einer zweiten Tabelle werden die Artikel Lagerorten zugeordnet. Dort steht auch die Anzahl, wie viel Stück von dem Artikel sich an diesem Lagerort befinden.
Jetzt möchte ich gerne mit einer Abfrage nur die Artikel aufgelistet bekommen, deren Anzahl unter dem Mindestbestand liegt.

Tabelle artikel:
artikel_id PK
artikel_mindestbestand

Tabelle artikel_lagerorte:
artikel_id FK
lagerort_id FK
artikel_lagerort_menge

Ich habe es mit dieser Abfrage versucht
Code:
SELECT
a.artikel_id
FROM
artikel a
WHERE
a.artikel_mindestbestand > (SELECT
SUM(al.artikel_lagerorte_menge)
FROM
artikel_lagerorte al
WHERE
al.artikel_id = a.artikel_id)

Allerdings bekomme ich damit keine Ergebnisse zurück.
Könnte mir da jemand auf die Sprünge helfen?
Danke schonmal im Voraus.
 
Zuletzt bearbeitet:
was liefert dir denn

Code:
SELECT
SUM(al.artikel_lagerorte_menge)
FROM
artikel_lagerorte al
WHERE
al.artikel_id = a.artikel_id)
für nen wert zurück?

vll liegts daran
 
Zuletzt bearbeitet:
Danke, aber das t leider nicht. Der sagt mir die Tabelle al sei nicht bekannt. Wenn ich stattdessen den vollständigen Namen angebe ist zwar die Fehlermeldung weg aber ich kriege auch wieder Null Ergebnisse.

Das mit dem SUM sollte kein Problem sein.
Code:
SELECT
SUM(al.artikel_lagerorte_menge)
FROM
artikel_lagerorte al
WHERE
al.artikel_id = '2'
So funktioniert es ja. Und gibt mir auch die gewünschte Summe zurück.
 
ich glaub ich habs...

das problem ist die where klauses im letzten select statement! du selectierst ja nur die summe über die lagerorte....

daher hast du auch keine zugriff auf die artikel_id...

lass entweder die where klausel mal weg oder probier mal

Code:
SELECT
SUM(al.artikel_lagerorte_menge) al.artikel_id


edit: käse... hab mir grad mal xampp runtergezogen... daran liegts leider nicht....
 
Zuletzt bearbeitet:
Das bringt leider beides nichts.

Ersteres geht nicht, weil sich die 2. Abfrage ohne den WHERE-Part nicht mehr auf den Artikel der Hauptabfrage bezieht und somit eigentlich die Summe aller Artikel zählt (seltsamerweise ist das Ergebnis trotzdem Null).

Der zweite Vorschlag bringt nur eine Fehlermeldung.

Was mich am meisten verwundert, ich hab mal die Abfrage angepasst und > geben < getauscht mir alle alle Artikel anzeigen zu lassen deren Bestand größer ist als der Mindestbestand.
Code:
SELECT
a.artikel_id
FROM
artikel a
WHERE
a.artikel_mindestbestand < (SELECT
SUM(al.artikel_lagerorte_menge)
FROM
artikel_lagerorte al
WHERE
al.artikel_id = a.artikel_id)

Und siehe da, es funktioniert.

Das bedeutet also, wenn ein Artikel nicht im Lager vorhanden ist gibt die Abfrage kein Ergebnis bzw NULL zurück das läst sich nicht mit dem Mindestbestand vergleichen .

Wie bekomme ich es nun hin, das im Falle des nicht vorhanden seins eines Artikels ein Integer Wert zurückgegeben wird?
 
Zuletzt bearbeitet:
beim anlegen eines artikels in jedem lagerort ebenfalls einen anlegen mit menge 0...

btw:

ich hab mir grad mal ne datenbank nach deiner vorlage gebastelt (namen minimal anders)...

bei mir funktionierts komischerweise...

Code:
 SELECT a.id
FROM artikel a
WHERE a.mindestbestand > (
SELECT SUM( al.menge )
FROM lagerorte al
WHERE al.artikel_id = a.id )
Code:
testdaten:

lagerorte
id              1  	2  	3  	4
artikel_id 	 2 	2 	1 	4
lagerort_id 	 1 	2 	3 	4
menge 	         1 	1 	31 	23

artikel:
id   	        1  	2  	4
mindestbestand 	32 	3 	3

ergebnis:
id   	1  	2

Tabelle artikel_lagerorte:
artikel_id FK
lagerort_id FK
artikel_lagerort_menge
nen primärschlüssel hast du in der tabelle aber schon oder?
 
Zuletzt bearbeitet:
Einen Primärschlüssel gibt es bei artikel_lagerorte nicht, das es ja nur eine Hilfstabelle ist die die Tabellen artikel und lagerorte verknüpft.

Ich kann in dem Skript leider nicht jeden Artikel und jeden Lagerort erstmal mit 0 belegen.
Das sind momentan an die 150.000 Artikel und mehrere 100 Lagerorte. Tendenz steigend. Das wären ziemlich viele überflüssige Datensätze.
 
gib den lagerorten mal den primärschlüssel vll hilfts...

wiegesagt... bei mir funktionierts soweit...


gut das mit den artikeln seh ich ein... wie wärs mit einem dummy-lagerort wo jeder artikel standardmäßíg mit 0 drinsteht?
 
Der Primärschlüssel hilft leider nicht weil die Rückgabe immer noch NULL ist.

Der Dummy Lagerort wäre zwar eine Möglichkeit, aber es sind halt ziemlich viele überflüssige Datensätze die ich gerne vermeiden möchte.
 
Zuletzt bearbeitet:
OK jetzt hab ich es. Eigentlich hätte ich da auch sofort draufkommen können aber SQL ist bei mir auch schon etwas her.

Code:
SELECT
a.artikel_id
FROM
artikel a
WHERE
a.artikel_mindestbestand < (SELECT
SUM(al.artikel_lagerorte_menge)
FROM
artikel_lagerorte al
WHERE
al.artikel_id = a.artikel_id) OR
(SELECT
SUM(al.artikel_lagerorte_menge)
FROM
artikel_lagerorte al
WHERE
al.artikel_id = a.artikel_id) IS NULL

Trotzdem danke
 
Zurück