SQL Abfrage gesucht Datensätze in denen zwei Felder doppelt auftreten
Moin,
ich habe eine Tabelle in der für einen Wettbewerb verkaufte Produkte pro Auftrag gespeichert werden.
Jetzt möchte ich am liebsten direkt per SQL alle die Auftragsnummern finden, auf denen ein Produkt mehrfach verkauft wurde.
Bespiel
Auftrag Produkt
4711 2
4712 3
4712 4
4713 1
4713 1
4714 9
Hier hätte als Ausgabe gerne die beiden Datensätze mit Auftragsnummer 4713
Kann ich das in SQL umsetzen und vor allem wie?
Gruß
CB
ich habe eine Tabelle in der für einen Wettbewerb verkaufte Produkte pro Auftrag gespeichert werden.
Jetzt möchte ich am liebsten direkt per SQL alle die Auftragsnummern finden, auf denen ein Produkt mehrfach verkauft wurde.
Bespiel
Auftrag Produkt
4711 2
4712 3
4712 4
4713 1
4713 1
4714 9
Hier hätte als Ausgabe gerne die beiden Datensätze mit Auftragsnummer 4713
Kann ich das in SQL umsetzen und vor allem wie?
Gruß
CB
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 91470
Url: https://administrator.de/forum/sql-abfrage-gesucht-datensaetze-in-denen-zwei-felder-doppelt-auftreten-91470.html
Ausgedruckt am: 09.04.2025 um 02:04 Uhr
11 Kommentare
Neuester Kommentar
Hallo CB
So wie ich es verstanden habe möchtest du alle Aufträge aulesen, welche mehr als 1mal verkauft wurden.
Dazu folgenden Vorschlag von mir:
Erklärung:
Zuerst liese ich alle Datensätze aus der Tabelle "auftraege" (Deine Tabelle mit den Aufträgen drin). Mittels der "while"-Schleife gehe ich jeden einzelnen Datensatz durch. Mit der zweiten Abfrage filtere ich die Einträge mit dem aktuellen Datensatz der ersten Abfrage und prüfe mit der Funktion "mysql_num_rows" wie viel Einträge mit dem Filter gefunden worden sind.
Wenn es mehr als ein Auftrag ist, wird die IF-Schleife durchlaufen, ansonsten wird der nächste Datensatz verarbeitet.
So erhälst du genau die Liste welche du oben dargestellt hast.
Ich das etwa das was du dir vorgestellt hast?
Über eine Rückmeldung würde ich mich freuen.
Gruss
scan
So wie ich es verstanden habe möchtest du alle Aufträge aulesen, welche mehr als 1mal verkauft wurden.
Dazu folgenden Vorschlag von mir:
$mysql_auftraege = mysql_query("SELECT * FROM auftraege");
while($auftraege = mysql_fetch_array($mysql_auftraege)) {
$mysql_anzahl = mysql_query("SELECT * FROM auftraege WHERE auftrag = '".$auftraege['auftrag']."'");
if(mysql_num_rows($mysql_anzahl) > 1) {
echo "Der Artikel ".$auftraege['auftrag']." wurde ".mysql_num_rows($mysql_anzahl)." verkauft!<br>";
}
}
Erklärung:
Zuerst liese ich alle Datensätze aus der Tabelle "auftraege" (Deine Tabelle mit den Aufträgen drin). Mittels der "while"-Schleife gehe ich jeden einzelnen Datensatz durch. Mit der zweiten Abfrage filtere ich die Einträge mit dem aktuellen Datensatz der ersten Abfrage und prüfe mit der Funktion "mysql_num_rows" wie viel Einträge mit dem Filter gefunden worden sind.
Wenn es mehr als ein Auftrag ist, wird die IF-Schleife durchlaufen, ansonsten wird der nächste Datensatz verarbeitet.
So erhälst du genau die Liste welche du oben dargestellt hast.
Ich das etwa das was du dir vorgestellt hast?
Über eine Rückmeldung würde ich mich freuen.
Gruss
scan
Hi,
ach so, die Zahl dahinter ist, wieviel mal der Artikel mit diesem Auftrag verkauft worden ist?
Dann musst du das Script einbisschen umsschreiben:
Mit dem abgeänderten Script werden die verkauften Artikel zusammengezählt und danch geprüft ob sie mehr als 2mal verkauft wurden.
Bei der Stelle:
Kannst du die Anzahl nötigen verkäufe regeln.
Bei diesem Beispiel wird der Auftrag ab 3 Artikel aufgenommen.
Gruss
scan
ach so, die Zahl dahinter ist, wieviel mal der Artikel mit diesem Auftrag verkauft worden ist?
Dann musst du das Script einbisschen umsschreiben:
$mysql_auftraege = mysql_query("SELECT * FROM auftraege");
while($auftraege = mysql_fetch_array($mysql_auftraege)) {
//Variable mit den Anzahl verkauften Artikel zurücksetzen
$anzahl = 0;
//Nur Einträge auslesen, welche die aktuelle Auftragsnr. haben
$mysql_anzahl = mysql_query("SELECT * FROM auftraege WHERE auftrag = '".$auftraege['auftrag']."'");
while($sql_anzahl = mysql_fetch_array($mysql_anzahl)) {
//Anzahl verkaufte Artikel zu Variabel hinzu addieren
$anzahl = $anzahl + $sql_anzahl['anzahl'];
}
//Wenn alle Aufträge durchgearbeitet sind prüfen ob Artikel mehr als 3mal verkauft wurde.
if($anzahl > 2) {
echo "Der Artikel ".$auftraege['auftrag']." wurde ".mysql_num_rows($mysql_anzahl)." verkauft!<br>";
}
}
Mit dem abgeänderten Script werden die verkauften Artikel zusammengezählt und danch geprüft ob sie mehr als 2mal verkauft wurden.
Bei der Stelle:
if($anzahl > 2) {
Kannst du die Anzahl nötigen verkäufe regeln.
Bei diesem Beispiel wird der Auftrag ab 3 Artikel aufgenommen.
Gruss
scan
Jetzt habe ich es glaub kappiert.
Folgendes Script:
Mit diesem Script wird jeder Auftag durchgegangen und gerpüft wieviele andere Aufträge gibt es mit der gleichen Auftragsnummer und mit der gleichen produkt_id.
Ist das dein Ziel??
Gruss
scan
Folgendes Script:
$mysql_auftraege = mysql_query("SELECT * FROM auftraege");
while($auftraege = mysql_fetch_array($mysql_auftraege)) {
//Nur Einträge auslesen, welche die aktuelle Auftragsnr. haben
$mysql_anzahl = mysql_query("SELECT * FROM auftraege WHERE auftrag = '".$auftraege['auftrag']."' AND auftrags_id = '".$auftraege['auftrags_id']."'");
if(mysql_num_rows($mysql_anzahl) > 1) {
echo "Der Artikel ".$auftraege['auftrag']." wurde ".mysql_num_rows($mysql_anzahl)." verkauft!<br>";
}
}
Mit diesem Script wird jeder Auftag durchgegangen und gerpüft wieviele andere Aufträge gibt es mit der gleichen Auftragsnummer und mit der gleichen produkt_id.
Ist das dein Ziel??
Gruss
scan
Hallo,
die Lösung ist mit den verschachtelten Schleifen sehr unellegant. Da Aufgabe gehört zu denen, die man besser gleich im DBMS abfrühstückt und nicht mit PHP o.ä. angeht.
Zeilen mit gleichen Einträgen zu finden ist in SQL nicht 100% intuitiv, wird aber oft genug erklärt. Man muss nach der gewünschten Spalte gruppieren, diese Gruppierung zählen, und alle mit > 1 sind dann wohl doppelt. Das lässt sich auch erweitern auf Bestellungen, die Posten doppelt haben, du musst dann nur zuerst nach der OrderNr gruppieren, dann nach Artikel-ID.
Grob:
SELECT * FROM Bestellungen WHERE date... AND HAVING COUNT(sold_product) > 1 GROUP BY order_nr, sold_product, ...
Muss gestehen, dass ich da auch immer etwas rumporieren muss, letztlich kommt man da aber zu ganz schönen Lösungen.
Gruß
Filipp
die Lösung ist mit den verschachtelten Schleifen sehr unellegant. Da Aufgabe gehört zu denen, die man besser gleich im DBMS abfrühstückt und nicht mit PHP o.ä. angeht.
Zeilen mit gleichen Einträgen zu finden ist in SQL nicht 100% intuitiv, wird aber oft genug erklärt. Man muss nach der gewünschten Spalte gruppieren, diese Gruppierung zählen, und alle mit > 1 sind dann wohl doppelt. Das lässt sich auch erweitern auf Bestellungen, die Posten doppelt haben, du musst dann nur zuerst nach der OrderNr gruppieren, dann nach Artikel-ID.
Grob:
SELECT * FROM Bestellungen WHERE date... AND HAVING COUNT(sold_product) > 1 GROUP BY order_nr, sold_product, ...
Muss gestehen, dass ich da auch immer etwas rumporieren muss, letztlich kommt man da aber zu ganz schönen Lösungen.
Gruß
Filipp