chb1982
Goto Top

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

Content-Key: 91470

Url: https://administrator.de/contentid/91470

Printed on: April 26, 2024 at 08:04 o'clock

Member: scan5416
scan5416 Jul 07, 2008 at 12:32:44 (UTC)
Goto Top
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:

$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
Member: chb1982
chb1982 Jul 07, 2008 at 12:43:40 (UTC)
Goto Top
Hi,

danke dafür erstmal.

Das ist aber nicht ganz das, was ich suche. Ich möchte nicht alle doppelten Aufträge haben, sondern alle, die mehr als einmal mit gleichem Produkt verkauft wurden.

In dem Beispiel unten wurder unter Auftrag 4711 einmal Produkt 1 und einmal 2 verkauft. Der interessiert mich nicht.
Mich interessiert nur Auftrag 4712 in dem zwei mal das Produkt 3 steht.

4711 1
4711 2
4712 3
4712 3
Member: scan5416
scan5416 Jul 07, 2008 at 13:04:04 (UTC)
Goto Top
Hi,

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
Member: chb1982
chb1982 Jul 07, 2008 at 13:06:29 (UTC)
Goto Top
Nein. Die Zahl dahinter ist nicht wie oft das Produkt verkauft wurde sondern nur die Produkt_id

in 4711 wurde einmal Produkt 1 und einmal 2 verkauft
in 4712 wurde zwei mal das Produkt 3 verkauft.
Member: scan5416
scan5416 Jul 07, 2008 at 13:13:45 (UTC)
Goto Top
Jetzt habe ich es glaub kappiert.

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
Member: chb1982
chb1982 Jul 07, 2008 at 13:18:17 (UTC)
Goto Top
Hm.... Scheint irgendwie das zu sein. Allerdings weiß ich nicht, was du mit auftrag und auftrags_id meinst face-smile


Ich habe die Auftragsnummer = order_nr = 4711, 4712
und das Verkaufte Produkt zu dem Auftrag = sold_product = 1, 2, 3 usw.
Member: chb1982
chb1982 Jul 07, 2008 at 14:01:13 (UTC)
Goto Top
So. Das ist jetzt meine Lösung face-smile


$db=mysql_connect(c_db_server,c_db_user,c_db_pass);
mysql_select_db(c_db_database);
$qry_get_products = mysql_query("select * from contest_sold_product where date between '2008-04-02' and '2008-06-30' order by location_id");

?>
<table border="1">
<tr>
<th>AuftragsNr</th>
<th>Produkt</th>
<th>Berater</th>
<th>Filiale</th>
</tr>

<?

while($products=mysql_fetch_array($qry_get_products)){
$arProd = array();
$qry_get_order=mysql_query("select * from contest_sold_product where date between '2008-04-02' and '2008-06-30' and order_nr = '".$products['order_nr']."'");

if(mysql_num_rows($qry_get_order) > 1) {
while($order=mysql_fetch_array($qry_get_order)){
if(in_array($order['sold_product'],$arProd)) {
echo "<tr>";
echo "<td>".$order['order_nr']."</td>";
echo "<td>".$order['sold_product']."</td>";
echo "<td>".$order['sb_consultant']."</td>";
echo "<td>".$order['location_id']."</td>";
}
$arProd=$order['sold_product'];
}

}

}
Member: scan5416
scan5416 Jul 07, 2008 at 14:26:37 (UTC)
Goto Top
Wunderbar!

Demfall konnte ich dir helfen...

Bitte Thread auf gelöst setzen.

Über eine Bewertung würde ich mich freuen.

Gruss

scan
Member: filippg
filippg Jul 07, 2008 at 14:54:30 (UTC)
Goto Top
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
Member: chb1982
chb1982 Jul 07, 2008 at 16:38:15 (UTC)
Goto Top
Hi Filipp,

das die Lösung in PHP nicht die eleganteste ist habe ich mir schon gedacht. Allerdings kam mir nicht in den Sinn, wie man das in SQL lösen kann - daher ja dieser Beitrag.

Ich werde mir das morgen mal mit deinem Gedankenanstoß in SQL probieren. Das ist definitiv die schönere und vor allem auch schnellere Lösung.

Danke!

Gruß
Christoph
Member: scan5416
scan5416 Jul 08, 2008 at 05:09:19 (UTC)
Goto Top
hi

Das diese Lösung nicht die schönste ist, ist wohl klar.
Die Hauptsache ist, dass es funktioniert. Die Schönheit ist für mich sekundär.

Arbeite schon immer so. Ist für mich einfacher, da sie einen logischen aufbau und realtiv einfach zu verstehen.

Gruss

scan