Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

SQL Abfrage gesucht Datensätze in denen zwei Felder doppelt auftreten

Frage Entwicklung Datenbanken

Mitglied: chb1982

chb1982 (Level 2) - Jetzt verbinden

07.07.2008, aktualisiert 08.07.2008, 5873 Aufrufe, 11 Kommentare

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
Mitglied: scan5416
07.07.2008 um 14:32 Uhr
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:

01.
$mysql_auftraege = mysql_query("SELECT * FROM auftraege"); 
02.
while($auftraege = mysql_fetch_array($mysql_auftraege)) { 
03.
    $mysql_anzahl = mysql_query("SELECT * FROM auftraege WHERE auftrag = '".$auftraege['auftrag']."'"); 
04.
    if(mysql_num_rows($mysql_anzahl) > 1) { 
05.
        echo "Der Artikel ".$auftraege['auftrag']." wurde ".mysql_num_rows($mysql_anzahl)." verkauft!<br>"
06.
07.
}
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
Bitte warten ..
Mitglied: chb1982
07.07.2008 um 14:43 Uhr
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
Bitte warten ..
Mitglied: scan5416
07.07.2008 um 15:04 Uhr
Hi,

ach so, die Zahl dahinter ist, wieviel mal der Artikel mit diesem Auftrag verkauft worden ist?

Dann musst du das Script einbisschen umsschreiben:

01.
$mysql_auftraege = mysql_query("SELECT * FROM auftraege"); 
02.
while($auftraege = mysql_fetch_array($mysql_auftraege)) { 
03.
    //Variable mit den Anzahl verkauften Artikel zurücksetzen 
04.
    $anzahl = 0; 
05.
 
06.
    //Nur Einträge auslesen, welche die aktuelle Auftragsnr. haben 
07.
    $mysql_anzahl = mysql_query("SELECT * FROM auftraege WHERE auftrag = '".$auftraege['auftrag']."'"); 
08.
    while($sql_anzahl = mysql_fetch_array($mysql_anzahl)) { 
09.
        //Anzahl verkaufte Artikel zu Variabel hinzu addieren 
10.
        $anzahl = $anzahl + $sql_anzahl['anzahl']; 
11.
12.
     
13.
    //Wenn alle Aufträge durchgearbeitet sind prüfen ob Artikel mehr als 3mal verkauft wurde. 
14.
   if($anzahl > 2) { 
15.
        echo "Der Artikel ".$auftraege['auftrag']." wurde ".mysql_num_rows($mysql_anzahl)." verkauft!<br>"
16.
17.
}
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:
01.
if($anzahl > 2) {
Kannst du die Anzahl nötigen verkäufe regeln.
Bei diesem Beispiel wird der Auftrag ab 3 Artikel aufgenommen.

Gruss

scan
Bitte warten ..
Mitglied: chb1982
07.07.2008 um 15:06 Uhr
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.
Bitte warten ..
Mitglied: scan5416
07.07.2008 um 15:13 Uhr
Jetzt habe ich es glaub kappiert.

Folgendes Script:
01.
$mysql_auftraege = mysql_query("SELECT * FROM auftraege"); 
02.
while($auftraege = mysql_fetch_array($mysql_auftraege)) { 
03.
 
04.
    //Nur Einträge auslesen, welche die aktuelle Auftragsnr. haben 
05.
    $mysql_anzahl = mysql_query("SELECT * FROM auftraege WHERE auftrag = '".$auftraege['auftrag']."' AND auftrags_id = '".$auftraege['auftrags_id']."'"); 
06.
   if(mysql_num_rows($mysql_anzahl) > 1) { 
07.
        echo "Der Artikel ".$auftraege['auftrag']." wurde ".mysql_num_rows($mysql_anzahl)." verkauft!<br>"
08.
09.
}
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
Bitte warten ..
Mitglied: chb1982
07.07.2008 um 15:18 Uhr
Hm.... Scheint irgendwie das zu sein. Allerdings weiß ich nicht, was du mit auftrag und auftrags_id meinst


Ich habe die Auftragsnummer = order_nr = 4711, 4712
und das Verkaufte Produkt zu dem Auftrag = sold_product = 1, 2, 3 usw.
Bitte warten ..
Mitglied: chb1982
07.07.2008 um 16:01 Uhr
So. Das ist jetzt meine Lösung


$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'];
}

}

}
Bitte warten ..
Mitglied: scan5416
07.07.2008 um 16:26 Uhr
Wunderbar!

Demfall konnte ich dir helfen...

Bitte Thread auf gelöst setzen.

Über eine Bewertung würde ich mich freuen.

Gruss

scan
Bitte warten ..
Mitglied: filippg
07.07.2008 um 16:54 Uhr
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
Bitte warten ..
Mitglied: chb1982
07.07.2008 um 18:38 Uhr
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
Bitte warten ..
Mitglied: scan5416
08.07.2008 um 07:09 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Datenbanken
gelöst SQL-Abfrage - DISTINCT - letztes Datum (3)

Frage von emeriks zum Thema Datenbanken ...

Batch & Shell
gelöst Findstr - code für schwieriger Abfrage gesucht (9)

Frage von reissaus73 zum Thema Batch & Shell ...

Datenbanken
SUM oder AVG in SQL Abfrage dauert viel zu lange warum? (5)

Frage von samet22 zum Thema Datenbanken ...

Datenbanken
gelöst SQL-Abfrage mit MAX() (9)

Frage von FrAmEr zum Thema Datenbanken ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...