SQL-Befehl
Dani
- datenbank
Hallo,
ich brauche Hilfe bei einem SQL-Befehl.Ausschnitt aus Tabelle:
subNummer Nummer
S1 ________ 1000
S2 ________ 1000
S2 ________ 1001
S2 ________ 1002
S3 ________ 1002
S4 ________ 1001
SELECT subNummer FROM tabelle where nummer in (1000,1001,1002)
Liefert ALLE subNummern (S1 bis S4) die entweder 1000, 1001 oder 1002 in der Spalte nummer enthalten haben. Ich brauche aber nur die subNummern die 1000 und 1001 und 1002 enthalten haben (im Beispiel S2). Ich bekomms einfach nicht hin, würde mich um Hilfe freuen!
Hi,
ich weiß gerade nicht, ob's da noch was kürzeres gibt, aber das hier sollte klappen. Die Frage ist nur, kannst du deiner Abfrage im Voraus mitgeben wie viele Einträge diese IN-Liste enthält? Wenn ja:
SELECT subNummer
FROM tabelle
WHERE nummer IN (1000,1001,1002)
GROUP BY subNummer
HAVING COUNT(*) = 3
-> Sucht Datensätze die den Kriterien entsprechen, fasst sie nach gleicher subNummer zusammen und zählt dabei, wie viele zusammengefasst wurden. Du musst allerdings dazu wissen, nach wievielen Zusammenfassungen du suchst.
MfG
Rouven
Hi !
SELECT subNummer
FROM tabelle
WHERE nummer IN (1000,1001,1002)
GROUP BY subNummer
HAVING COUNT(*) = 3
bei
S1--------1000
S1--------1000
S1--------1000
S2--------1000
S2--------1001
S2--------1002
bekommt man aber S1 und S2 als Antwort. Gesucht war aber, daß nur S2 als Antwort kommt, weil S2 die einzige ist, die 1000, 1001 und 1002 hat.
Gruß
Hans
Hi,
komm, lass uns streiten, dafür ist deine Lösung untauglich oder zumindest extrem aufwändig für variierende Anzahlen.
Deine Kritik ist sicherlich berechtigt, da kann ich dann nur mit schlechtem Design kontern, da die Einträge in der unmittelbaren Form dann keinen Sinn machen.
MfG
Rouven
Okay danke es funktioniert. Eine Frage hätt ich noch, wie kann ich einen select Count(*) auf diese Abfrage noch absetzen, für den Fall dass die Abfrage keine Ergebnisse zurückliefert?
Hi !
Jetzt weiß ich nicht, ob Deine MySQL-Version subselects unterstützt. Falls ja:
select count(1) into i from dual where exists (select irgendwas from tabelle);
i=0 -> kein Ergebnis
i=1 -> Mindest. 1 Ergebnis
Gruß
Hans
Hi !
Jetzt weiß ich nicht, ob Deine MySQL-Version subselects unterstützt. Falls ja:
select count(1) into i from dual where exists (select irgendwas from tabelle);
i=0 -> kein Ergebnis
i=1 -> Mindest. 1 ErgebnisGruß
Hans
Nein, leider funktioniert das nicht. Hättest du mir noch eine Idee? Komme leider im Moment kaum weiter.
Hi !
Jetzt weiß ich nicht, ob Deine MySQL-Version subselects unterstützt. Falls ja:
select count(1) into i from dual where exists (select irgendwas from tabelle);
i=0 -> kein Ergebnis
i=1 -> Mindest. 1 ErgebnisGruß
Hans
Nein, leider funktioniert das nicht. Hättest du mir noch eine Idee? Komme leider im Moment kaum weiter.
Kann mir denn keiner helfen?
Ist echt nicht so praktisch dass die aktuellen Themen nicht oben stehen.
Hi !
Kann mir denn keiner helfen?
Ist echt nicht so praktisch dass die aktuellen Themen nicht oben stehen.
Also, Du machst folgendes:
select count(spalte) into i from tabelle where irgend_eine_bedingung;
Dann müsstest Du in i einen Wert haben, der Dir die Anzahl der gefundenen Ergebnisse gibt.
Gruß
Hans
Hallo.
Ist echt nicht so praktisch dass die aktuellen Themen nicht oben stehen.
So wie es ist, ist es praktisch.
MfG, at
Hi,
Okay danke es funktioniert. Eine Frage hätt ich noch, wie kann ich einen select Count(*) auf diese Abfrage noch absetzen, für den Fall dass die Abfrage keine Ergebnisse zurückliefert?
In dem Fall, daß die Abfrage keine Ergebnisse liefert, ist der count(*) für diese Abfrage immer 0 - also gibt es keinen Grund, extra noch eine Abfrage für diese 0 an die Datenbank zu schicken.
Wieviele Datensätze die eigentliche Abfrage liefert, läßt sich üblicherweise auch ohne zusätzliche Abfrage rausfinden (in php für mysql mit mysql_num_rows, in anderen Sprachen und bei anderen DB-Systemen wird es ähnliche Konstrukte geben ...)
cu,
Andreas
Hi,
komm, lass uns streiten, dafür ist deine Lösung untauglich oder zumindest extrem aufwändig für variierende Anzahlen.
Mal davon abgesehen, daß meine Lösung richtig ist: Natürlich ist sie für den Fall, daß man 1000 - 1010 braucht, entsprechend zu adaptieren, aber man kann nicht sagen, daß eine Lösung für beliebig komplizierte Sachverhalte immer trivial und jederzeit mit minimalem Aufwand erweiterbar sein muß.
Deine Kritik ist sicherlich berechtigt, da kann ich dann nur mit schlechtem Design kontern, da die Einträge in der unmittelbaren Form dann keinen Sinn machen.
Nun, je nachdem, wie die "Hauptaufgabe" der Applikation aussieht. Wenn das Design am Anfang darauf abgezielt hat, einfach nur Zahlen zu erfassen und am Ende des Monats herauszufinden, wie oft "1000" vorkommt, mag das Design richtig sein. Sollte allerdings die Hauptaufgabe jene von Dani zu Anfang beschriebene sein, dann muß man an dem Design in der Tat gehörig etwas machen.
Gruß
Hans
yo,
man muss deine query nur leicht abändern, und dann löst es das problem, dass hans angesprochen hat.
SELECT subNummer
FROM tabelle
WHERE nummer IN (1000,1001,1002)
GROUP BY subNummer
HAVING COUNT(DISTINCT nummer) = 3
Ilja
Hi Ilja,
gut zu Wissen, Distinct innerhalb von Count hatte ich bisher noch nicht gesehen...
MfG
Rouven
Hi !
SELECT subNummer
FROM tabelle
WHERE nummer IN (1000,1001,1002)
GROUP BY subNummer
HAVING COUNT(DISTINCT nummer) = 3
hätte ich nicht gedacht, daß "HAVING" auch auf Spalten funktioniert, die zwar in der Tabelle, aber nicht in der "GROUP BY"-Anweisung vorkommen.
Wieder was gelernt :-)
Gruß
Hans
Hi !
subNummer Nummer
S1 ________ 1000
S2 ________ 1000
S2 ________ 1001
S2 ________ 1002
S3 ________ 1002
S4 ________ 1001SELECT subNummer FROM tabelle where nummer in (1000,1001,1002)
Liefert ALLE subNummern (S1 bis S4) die entweder 1000, 1001 oder 1002 in der Spalte nummer enthalten haben. Ich brauche aber nur die subNummern die 1000 und 1001 und 1002 enthalten haben (im Beispiel S2). Ich bekomms einfach nicht hin, würde mich um Hilfe freuen!
select a.subnummer from tabelle a, tabelle b, tabelle c where a.nummer=1000 and a.subnummer=b.subnummer and b.nummer=1001 and a.subnummer=c.subnummer and c.nummer=1002;
Gruß
Hans
yo,
select a.subnummer from tabelle a, tabelle b, tabelle c where a.nummer=1000 and a.subnummer=b.subnummer and b.nummer=1001 and a.subnummer=c.subnummer and c.nummer=1002;
auch bei dieser lösung fehlt das DISTINCT.
Ilja