SQL: Mehrere Zeilen prüfen, gruppieren und zählen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
-
Hallo
Ich arbeite zur Zeit an einem Script, welches mehrere Einträge vergleichen soll.
Dafür habe ich folgende Struktur.
Eine Komponente hat mehrere Einträge mit Namen und Wert. In Realität sind es ca. 100 Werte, nicht nur zwei.
In diesem Fall möchte ich jetzt zum Beispiel prüfen ob eine Komponente besteht, die Einträge mit dem Namen p001 und Wert 88 hat, sowie Name 002 und Wert 45.
Alle Anforderungen müssen eingehalten werden, sobald ein Wert zu wenig oder zu viel ist, ein Wert nicht stimmt oder der Name anders gewählt wurde, soll keine Komponente gefunden werden.
Ich löse das momentan mit diesem Query:
SELECT Komponente, COUNT(*) FROM Ausdruecke WHERE Name = "p001" AND Wert = 88 OR Name = "p002" AND Wert = 45 GROUP BY Komponente
Damit kriege ich folgendes Ergebnis.
Bei der einen Komponente kriege ich Anzahl zwei zurück, bei der anderen nur eine. Weil ich nach zwei Ausdrücken suche, stimmt also nur die Komponente 1179425 komplett überein.
Dieser Query ist meiner Meinung nach aber nicht ganz sauber. Bei 100 Einträgen wird er extrem lang und ich muss dann im Script immer noch prüfen ob die Anzahl übersteinstimmt. Gibt es dafür einen besseren Weg? Soll ich die Tabelle vielleicht ganz anders strukturieren?
Falls das schon so passt wäre es aber gut, wenn ich Anstatt der Anzahl als Ergebnis direkt prüfen könnte, ob der Count zwei einspricht und nur diese Komponenten Nummern als Ergebnis bekomme. Wie ist das möglich?
Freundliche Grüsse -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Weil ich nach zwei Ausdrücken suche, stimmt also nur die Komponente 1179425 komplett überein.
Wenn ich das richtig verstehe möchtest du aus zwei Bedingungen nur die Elemente haben welche beide Bedingungen erfüllen.
Glaube das könnte mit INTERSECT gehen oder für MySQL mit IN
SELECT something FROM somewhere WHERE x=A INTERSECT SELECT something FROM somewhere WHERE x=B;
SELECT something FROM somewhere WHERE x=A IN (SELECT something FROM somewhere WHERE x=B);
Oder so ähnlich -
Die INTERSECT-Lösung ist in diesem Falle sicherlich empfehlenswert. Wenn noch eine Alternative getestet werden sollte, dann kann man natürlich auch die Datenbank das mit dem COUNT(*) auswerten lassen:
SELECT Komponente, COUNT(*) AS anz FROM Ausdruecke WHERE Name = "p001" AND Wert = 88 OR Name = "p002" AND Wert = 45 GROUP BY Komponente HAVING anz = 2;
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage