Top-Themen

Aktuelle Themen (A bis Z)

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, 5964 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 ..
Ähnliche Inhalte
Datenbanken
SQL-Abfrage und leere Felder vermeiden
gelöst Frage von zwangseinweisungDatenbanken12 Kommentare

Hallo, ich mache grade eine Ausbildung zum Fi-Si und vor dem Weihnachtsurlaub haben wir im Fach Datenbanken noch eine ...

Datenbanken
Datensatz mit 2 Felder anfügen Access
gelöst Frage von Dr.CornwallisDatenbanken2 Kommentare

Hallo, ich habe 2 Felder: 1. Kombifeld - PersNr zum auswählen 2. Textfeld - hier kann man beliebigen Text ...

Datenbanken
MS SQL: Zwei numeric-Felder in neuem Feld verbinden
gelöst Frage von BluejetDatenbanken9 Kommentare

Hallo zusammen, ich melde mich einmal mit einer wahrscheinlich sehr einfachen Sache, bei der ich jedoch gerade etwas hänge ...

Datenbanken
Doppelten Datensatz suchen und Wert erhöhen
gelöst Frage von dax4funDatenbanken1 Kommentar

Moin, es gingen mir schon alle Suchbegriffe beim googlen aus um eine SQL Abfrage zu basteln die folgendes tun ...

Neue Wissensbeiträge
Windows 10

Autsch: Microsoft bündelt Windows 10 mit unsicherer Passwort-Manager-App

Tipp von kgborn vor 4 StundenWindows 10

Unter Microsofts Windows 10 haben Endbenutzer keine Kontrolle mehr, was Microsoft an Apps auf dem Betriebssystem installiert (die Windows ...

Sicherheits-Tools

Achtung: Sicherheitslücke im FortiClient VPN-Client

Tipp von kgborn vor 6 StundenSicherheits-Tools

Ich weiß nicht, wie häufig die NextGeneration Endpoint Protection-Lösung von Fortinet in deutschen Unternehmen eingesetzt wird. An dieser Stelle ...

Internet

USA: Die FCC schaff die Netzneutralität ab

Information von Frank vor 20 StundenInternet3 Kommentare

Jetzt beschädigt US-Präsident Donald Trump auch noch das Internet. Der neu eingesetzte FCC-Chef Ajit Pai ist bekannter Gegner einer ...

DSL, VDSL

ALL-BM200VDSL2V - Neues VDSL-Modem mit Vectoring von Allnet

Information von Lochkartenstanzer vor 23 StundenDSL, VDSL1 Kommentar

Moin, Falls jemand eine Alternative zu dem draytek sucht: Gruß lks

Heiß diskutierte Inhalte
Netzwerkmanagement
Mehrere Netzwerkadapter in einem PC zu einem Switch zusammenfügen
Frage von prodriveNetzwerkmanagement21 Kommentare

Hallo zusammen Vorweg, ich konnte schon einige IT-Probleme mit Hilfe dieses Forums lösen. Wirklich klasse hier! Doch für das ...

Windows Server
Anmeldung direkt am DC nicht möglich
Frage von ThomasGrWindows Server16 Kommentare

Hallo, ich habe bei unserem Server 2016 Standard ein Problem. Keine Ahnung wie das auf einmal passiert ist. Ich ...

Hardware
Links klick bei Maus funktioniert nicht
gelöst Frage von Pablu23Hardware16 Kommentare

Hallo erstmal. Ich habe ein Problem mit meiner relativ alten maus jedoch denke ich nicht das es an der ...

TK-Netze & Geräte
VPN-fähige IP-Telefone
Frage von the-buccaneerTK-Netze & Geräte15 Kommentare

Hi! Weiss noch jemand ein VPN-fähiges IP-Telefon mit dem man z.B. einen Heimarbeitsplatz gesichert anbinden könnte? Habe nur einen ...