SQL Mehrere Select-Abfragen in eine Tabelle?!?

joa die ident_id ist die eindeutige ID für die verschiedenen Geräte. Das Problem ist halt, dass ich die typ_id aus Tabelle 2 nehmen muss, aber das funktioniert ja eigentlich einwandfrei. naja ich probier mal nur mit tabelle1 was auf die reihe zu bekommen.
 
So hab da jetzt mal was mit Tabelle1 gemacht:

SELECT count( ident_id )
FROM Tabelle1
WHERE status_id =5
GROUP BY model_id

Dabei gibt er mir auch wieder keine nullen aus. Das liegt garantiert an der SQL-Version^^
 
Nein, deine Tabellenstruktur hat einen kleinen aber feinen Fehler. Wenn kein Gerät auf Status 4 steht, kann MySQL unmöglich Status 4 erraten und auch keine 0 dafür ausgeben. Du benötigst daher eine 3. Tabelle die alle möglichen Stati enthält. Über diese 3. Tabelle wird dann die Abfrage ausgeführt.

SELECT t3.statusname, COUNT(t1.ident_id) FROM status_tabelle t3 LEFT JOIN tabelle1 t1 ON t1.status_id = t3.status_id GROUP BY t3.status_id;
 
ok also wir ham auch noch die zusätzliche statustabelle. Hab dafür deine Abfrage mal wie folgt geändert:

SELECT t3.status_name, COUNT( t1.ident_id )
FROM t3
LEFT JOIN t1 ON t1.status_id = t3.status_id
LEFT JOIN t2 ON t1.model_id = t2.model_id
WHERE t2.typ_id =10
GROUP BY t3.status_id

Und immernoch die Ausgabe von vorher.
 
@pvc-junkie's Vorschlag klingt schlüssig.
Ich glaube, du machst durch das where evt, wieder alles zunichte. Weil wenn es angenommen zu dem typ 10 keine Einträge mit allen möglichen Status gibt, werden die fehlenden auch nicht zurück gegeben, sondern ausgefiltert. ;)

Probier es erstmal mit 2 Tabellen wie beschrieben.
zb.
SELECT t3.status_name, COUNT( t1.ident_id )
FROM t3
LEFT JOIN t1 ON t1.status_id = t3.status_id
GROUP BY t3.status_id

oder sowas in der Art:

SELECT t3.status_name, COUNT( t1.ident_id )
FROM t3
LEFT JOIN t1 ON t1.status_id = t3.status_id
LEFT JOIN t2 ON t1.model_id = t2.model_id AND t2.typ_id =10
GROUP BY t3.status_id
 
Zuletzt bearbeitet:
ja gut aber dann habe ich keine Zeile in der 0 stehen würde.
Jetzt hab ich mal ne Where abfrage aus t1 geholt und t2 ganz rausgelassen und er zeigt mir nur eine statt 5 Zeilen an.
 
Das WHERE t2.typ_id =10 fragt ausschließlich DS mit eben t2.typ_id =10 ab. Alles andere wird ignoriert.
In der Statustabelle muss natürlich auch eine Status_id 0 vorhanden sein. eben alle möglichen Status.


Darum sagte ich ja, stell doch mal den kleinen Dump mit Tabellenstruktur und paar Testdaten rein.
Nur so können wir sicher rausfinden, ob es an der SQL-Abfrage, Tabellenstruktur oder sogar an der SQL-Version liegt.
 
ja aber ich will ja auch nur Geräte mit der ID 10. Und warum brauch ich ne Status_ID 0?
Das mit dem Dump ist gar nit mal so einfach...kein Plan wies funktioniert^^
 
Das war nun ein Beispiel. Die kann auch 1 heißen.

Probier mal, ob du hierdurch wenigstens alle 0-er zurückbekommst.

SELECT t3.*
FROM t3
LEFT JOIN t1 ON t1.status_id = t3.status_id
LEFT JOIN t2 ON t1.model_id = t2.model_id AND t2.typ_id =10
WHERE t1.status_id IS NULL
GROUP BY t3.status_id

Das wären dann zwar 2 SQL-Abfragen, aber zumindest ne schnelle Notlösung.
 
ich hab aber doch keinen datensatz bei dem status_id "NULL" ist.
Es ist ja bei jedem Gerät eine der 5 status_id also von 1 bis 5 vergeben.
 
Wieso denn das? Da sagst doch selbst das er zb. Lager: 0 nicht anzeigt.
Es ist also anscheinend nicht zu jedem Gerät jede mögliche Status-ID von 1-5 auch tatsächlich vergeben.
Sondern manche status-id ist in den anderen Tabellen noch nicht zugeordnet/verknüpft und wird somit über Deine Abfrage nicht berücksichtigt und folglich nicht mit zurückgeben.

Das NULL in meinem letzten Beispiel ist die Negation der Ergebnismenge, welche durch das Left Join zurückgeliefert wird.
Wird nichts von t1 geliefert ist es NULL. Er gibt durch das WHERE t1.status_id IS NULL alles was nicht für die Bedingung zutrifft zurück. Dreht also quasi das Ergebnis um.
Es müsste dann also unter t1.status_id -> NULL (leer) stehen, wenn Du es Dir zb. so ausgeben würdest:

SELECT t3.*, t1.status_id
FROM t3
LEFT JOIN t1 ON t1.status_id = t3.status_id
LEFT JOIN t2 ON t1.model_id = t2.model_id AND t2.typ_id =10
WHERE t1.status_id IS NULL
GROUP BY t3.status_id

Damit könntest Du also alle Einträge bzw. Status_id aus t3 in jedem Fall immer ausgeben, die eben noch nicht einem Gerät zugeordnet sind. Eben die fehlende Zeile in Deiner anderen Abfrage. ^^
Wird überhaupt nichts zurückgegeben, würde das bedeuten dass alle Einträge mit allen möglichen Status-IDs belegt sind, es also keine 0-er Einträge in t3 gibt und Deine vorige Abfrage alles gefunden hat.
Das könnte man dann im Script durch die vorhergehende SQL abfragen und somit die 2. SQL nicht ausführen.

Ich hoffe das war halbwegs verständlich. ;)
Wenn diese Abfrage allerdings bei Dir so oder so ähnlich nicht funktionieren sollte, dann solltest du wirklich über eine neue SQL-Version nachdenken. Oder halt alles per Script zusammenzählen.

PS:
Mit 0-er meine ich übrigens Count = 0, also in t3 nicht zugeordnet/verknüpft
 
Zuletzt bearbeitet:
Naja guten Morgen erstmal und danke für deinen erneuten Versuch mir zu helfen.
Aber ich glaube wir reden die ganze Zeit aneinander vorbei^^

Gehn wir mal von folgendem Szenario aus:

ident_id-------typ_id-------status_id
00001-----------1---------------1
00002-----------1---------------1
00003-----------1---------------2
00004-----------1---------------4
00005-----------1---------------4
00006-----------1---------------5

Das heißt bei allen Geräten ist eine status_id vergeben. Ich möchte nun folgende Ausgabe

status_id--------Count
---1-----------------2----
---2-----------------1----
---3-----------------0----
---4-----------------1----
---5-----------------1----

Es sieht aber so aus:

status_id--------Count
---1-----------------2----
---2-----------------1----
---4-----------------1----
---5-----------------1----

Wär natürlich ärgerlich, wenn wir die ganze Zeit aneinander vorbei reden würden.
 
Also, einfach mal angenommen deine Angaben zu den Tabellen sind vollständig, dann ist dein Vorhaben unmöglich.
Ich nehme einfach mal an, dass du eine Klartext Beschreibungs-Taballe für den status verwendest. Die nenne ich jetzt einfach mal "STATUS". Du gehst dann schlicht so vor:

Code:
SELECT status_id, count(ident_id) as countage
from tabelle1
group by status_id

union

select status_id, 0 as countage
from STATUS as s
left outer join 
tabelle1 as t
on s.status_id = t.status_id
and t.status_id is null

Den rest solltest du selbst anpassen können
 
na super^^
ja von dem union hab ich auch schon gelesen. aber das geht erst ab sql4 oder? ham hier halt nur sql3 :(
 
ohne union ginge das so:

Code:
select s.status_id, count(ident_id) as countage
from STATUS AS s
left outer join
tabelle1 as t
on t.status_id = s.status_id
group by s.status_id
 
@toitoi
Ja eben. Die Status ID 3 wird in Deiner Abfrage nicht berücksichtigt. Da sie keinem Gerät zugeordnet ist. somit wird sie auch in deiner Abfrage von SQL nicht einbezogen, beachtet.
Du müsstest über 2 Abfragen gehen und diese explizit abfragen. Entweder in der Art wie @ag3nt oder mein IS NULL
Damit gibt es Dir alle NICHT-Übereinstimmungen zurück, also alles außerhalb der gefundenen eigentlichen Ergebnismenge.

status_id--------Count
---1-----------------2----
---2-----------------1----
---3-----------------0---- dieses
---4-----------------1----
---5-----------------1----


ident_id-------typ_id-------status_id <- hier kommt keine status_id 3 vor!
00001-----------1---------------1
00002-----------1---------------1
00003-----------1---------------2
00004-----------1---------------4
00005-----------1---------------4
00006-----------1---------------5
 
ne das klappt auch nicht. Ist ja eigenltich nix anderes, wie meine codes nur halt statt left join left outer join
 
@ relict: ja das dachte ich mir schon, dass er es nicht rafft, weil die status_id nicht vorhanden ist. dachte man könnte es halt umgehen.

hab jetzt auch mal deinen code von oben ausprobiert und er sagt mir dann auch: MySQL lieferte ein leeres Resultat zurück (d. h. null Zeilen).

irgendwie verstehe ich eure codes mit dem "Null" nicht...ich blick einfach nciht mehr durch. Ich glaub ich gebe auf..hmmm
 
Zuletzt bearbeitet:
Ich weiß nicht wie ich es noch erklären soll.

IS NULL heißt: Gib mir alles was zwar miteinander verglichen wurde, aber nicht auf die Bedingung zutrifft zurück.
SQL will immer alle DS und alle angegebenen Tabellen miteinander verknüpften.
Wenn also mindestens 2 Tabellen angegeben wurden, aber bspw. ohne Bedingung/ Einschränkung, würde alles mit allem kombiniert, was dann zu einer extremen Ergebnismenge führen kann. Siehe auch karthesisches Produkt aus der Mengenlehre.

Wenn SQL nun bspw. Deine 2 Tabellen miteinander vergleicht, aber in einer von beiden Datensätze/Werte stehen, die mit der anderen Tabelle über die Bedingung nicht miteinander verknüpft werden konnten (status_id 3), dann wird dieser nicht zugeordnete Datensatz zu NULL. Ist zwar existent, hängt aber sozusagen in der Luft. ^^

Du willst aber jetzt gerne diesen DS (status_id 3 aus statustabelle) ermitteln und in jedem Falle als Ergebnis haben.
Also fragst Du mit IS NULL alle DS ohne Übereinstimmungen ab, die auf die Bedingung nicht zutrafen und in der Luft hängen und lässt sie Dir damit zurückgeben.

Da es aber wie gerade gesagt jede Menge Kombinationen gibt - die "Lufthänger" nach wie vor mit jedem anderen DS kombiniert sind, kommt nun Group ins Spiel.
Das group führt doppelte Ergebnisse zu einem zusammen und tada, Du erhälst alle unterschiedlichen in der Luft hängenden Datensätze ohne Restmüll und Doppelungen. ;)

Analog zu IS NULL verhält sich quasi das Left outer Join.

Wieso das bei Dir nicht klappt weiß ich nicht. ^^

Diese Art Abfrage für alle Gefundenen

SELECT status_id, count(ident_id) as countage
from tabelle1
group by status_id

auswerten....

danach diese Abfrage für alle Nicht gefundenen also zb. status_id 3

select s.status_id, count(ident_id) as countage
from STATUS AS s
left outer join
tabelle1 as t
on t.status_id = s.status_id
group by s.status_id

auswerten...
 
hey ich danke euch vielmals für eure Hilfe aber irgendwie krieg ichs nit auf die Reihe.
Ich glaube ich muss meinem Chef klar machen, dass das so einfach nicht geht.
Ist halt so und er muss so klar kommen oder sich jemand "gebildeteren" suchen.
(Hab ja nur Ausbildung zum IT-Systemelektroniker)
 
Zurück
Oben