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
Kommentar vom Moderator Biber am 01.06.2010 um 08:05:54 Uhr
Nach AluCard7s Kommentar vom 31.05.2010 ist das Thema "erledigt" (im Sinne von gegenstandslos) und, soweit ich es einschätzen kann) auch die Lösung der Frage gegeben worden.

Ich setze es daher aus "Gelöst" und, weil ich hier keinen Take-Over irgendwann haben möchte, auf "Geschlossen".
GELÖST

Gefilterte Datenbankabfrage

Frage Entwicklung PHP

Mitglied: Alucard7

Alucard7 (Level 1) - Jetzt verbinden

22.01.2010, aktualisiert 01.06.2010, 3647 Aufrufe, 11 Kommentare

Hallo an alle Mitglieder,

ich muss für meinen Betrieb eine Datenbank erstellen mit Weboberfläche, in der ganz normal Daten eingeben, bearbeitet und gelöscht werden.
Dafür gibt es vorbestimmte Abfragen an die Datenbank, von denen die jetzige konkret gefiltert werden muss hinsichtlich doppelten Datensätzen.
Dazu habe ich versucht mit distinct meine Daten zu filtern, jedoch will ich nicht, dass alle angegeben Werte für die Überprüfung herangezogen werden.
Konkret sieht die Beispiel-Abfrage so aus:
01.
$query = "SELECT DISTINCT `name`,`medium`,`datum`,`neu` FROM `$db` ORDER BY name;";	
Jetzt möchte, dass nur der name zur Überprüfung genommen wird und nicht die anderen 3, da das Datum hier eine Filterung unmöglicht macht.
Könnte mir jemand zeigen, wie ich die Abfrage verändern muss, damit ich das gewünschte Ergebnis erhalte?
Danke!

Mit freundlichen Grüßen Alucard7
Mitglied: sputnik
23.01.2010 um 15:59 Uhr
DISTINCT bezieht sich auf den SELECT und nicht die Spalten. Versuche es mit einem GROUP BY.
Bitte warten ..
Mitglied: Biber
23.01.2010 um 20:02 Uhr
Moin Alucard7,

ich habe deine Frage auch seit gestern mehrfach nachhallen lassen.
Meine Befürchtung war und ist sogar, dass du eigentlich nach der WHERE-Klausel suchst:
01.
$query = "SELECT DISTINCT `name`,`medium`,`datum`,`neu` FROM `$db` WHERE Name ='whatever';";
Allerdings kollidiert diese Befürchtung mit deinem Satz
ich muss für meinen Betrieb eine Datenbank erstellen mit Weboberfläche...

Hoffe also, ich liege falsch.

Grüße
Biber
Bitte warten ..
Mitglied: Alucard7
23.01.2010 um 21:03 Uhr
Danke für die schnellen Antworten!

zu spytnik: werde ich demnächst ausprobieren, konnte mir aber bis jetzt noch nicht im klaren werden, was group by überhaupt genau macht.

zu biber: Du hoffst zurecht, da ich nicht nach bestimmten Namen suche, sondern alle doppelten Namen finden und alle dazugehörigen Einträge löschen will,
wenn möglichst in einer Abfrage.
Bitte warten ..
Mitglied: Biber
24.01.2010 um 18:10 Uhr
Moin Alucard7,

Zitat von Alucard7:
zu biber: Du hoffst zurecht,
Gottseidank.
da ich nicht nach bestimmten Namen suche, sondern alle doppelten Namen finden
und alle> dazugehörigen Einträge löschen will,
wenn möglichst in einer Abfrage.

Okay...
Aber dann brauchst du doch irgendeine Definition, was nun der Eintrag/Datensatz sein soll, der erhalten bleibt und welches die "doopelten" Datensätze sind, die weggebratzt werden.
Anders gefragt:
  • ist das Wichtige, dass jeder Name nur einmailg vorkommt und nebensächlich, was in den Feldern "Medium", "Datum", "neu" steht
  • oder ist der jüngste Datensatz (gemäß Inhalt von "Datum") der "einzig wahre" und alles andere wird recycled?
  • und natürlich auch...was zum Gates liegen da heute für Prinary-Key-Constraints drauf, wenn die Tabelle heute diesen Inhalt haben kann? Wodurch zeichnet sich heute ein "eindeutiger Datensatz" aus?

Grüße
Biber
Bitte warten ..
Mitglied: Alucard7
25.01.2010 um 01:27 Uhr
Jop, jeder name! soll nur einmalig vorkommen, der rest soll bei der doppelten suche ignoriert werden.
Zudem habr ich keinen Primary-Key der auto-inkrement ist, da die sortierung fortlaufend ist und ich lücken habe, wenn ich datensätze zwischendrin lösche.
Deshalb schreibe ich die id jedesmal neu für alle datensätze, funktioniert auch wunderbar.
Mit freundlichen Grüßen Alucard7
Bitte warten ..
Mitglied: Biber
25.01.2010 um 06:57 Uhr
Moin Alucard7,

sorry, montagmorgens bin ich immer etwas schwerer von Begriff.
Ich versuche noch mal, mein Verständnisproblem umzuformulieren.
Nach dem, was ich glaube verstanden zu haben, existieren in deiner Tabelle "Whatever" zum Beispiel die Sätze"
"Name" ,"Medium", "Datum", "neu"
"Heinz", "Buffy", "11.11.2007", "Ja"
"Heinz", "Steak", "12.12.2008", NULL
"Heinz","Sherry","31.12.2009" "Nein"
...

.. Also 3 Datensätze mit dem "gleichen" Namen Heinz... zwei sind also "doppelt" in deinem Sinn.
Welcher Satz soll erhalten bleiben, bzw. welche Werte in den Feldern "Medium", "Datum" und "neu" stehen in dem nicht zu löschenden Satz und wie ist dafür die Begründung/der Algorithmus?

Grüße
Biber
Bitte warten ..
Mitglied: Alucard7
25.01.2010 um 16:20 Uhr
Hi, bei mir sollte der erste Datensatz komplett erhalten bleiben und die übrigen komplett ignoriert werden, im endeffekt, dann gelöscht werden, das is aber kein problem.
Ich suche nur nach einer möglichst einfachen Abfrage an die Datenbank, die diese doppelten Einträge erkennt und nur den ersten oder so, hauptsache nur einen, ausgibt.
(ob da jetzt noch nach datum oder so gegangen wird, is zurzeit noch unrelevant, hauptsache es kommt erstmal überhaupt was richtiges raus, kann man später noch nachschauen.)
Mein Ansatz wäre halt:
$query = "SELECT DISTINCT `name`,`medium`,`datum`,`neu` FROM `$db` ORDER BY name;";
gewesen, jedoch werden wie oben erwähnt alle Spalten überprüft.
Rein logisch sollte es so aussehen:
$query = "SELECT DISTINCT `name`,NON-DISTINCT `medium`,`datum`,`neu` FROM `$db` ORDER BY name;";
geht halt leider nicht.
Mit freundlichen Grüßen Alucard7
Bitte warten ..
Mitglied: Biber
25.01.2010 um 17:05 Uhr
Ja nee, Alucard7,

dein Fern-Ziel is' schon klar mit dem EINmaligen Namen... siehe ganz ganz oben spytniks Antwort.

Die Namen einmalig bekommst ja sogar mit einem "SELECT DISTINCT NAME FROM tabelle" hin.

Frage ist doch, wenn zu diesem Namen "Heinz" nun partout noch Feldinhalte von medium/datum/neu angezeigt werden soll...welche sollen es dann sein?

Und ja, du hast es mehrfach bestätigt, es soll einfach "irgendwas" sein...
und das will mir nich' in die Birne... weder Montags noch in Monaten mit Vokalen im Namen...

Erwartetes Vorgehen wäre halt gewesen, wen du gesagt hättest "der älteste Datumswert von Heinz muss erhalten bleiben" oder "der Satz mit Status "neu" oder WTF.
Dann hätte esalles mit einem SubSelect gehen können auf ein spytniksches "Select name, min(datum) as erstDatum group by name" verJOINt mit der eigentlichen Tabelle.

Aber so kann ich doch nur empfehlen, mach ein
01.
 SELECT name,  FIRST(medium) as Medium, First(Datum) as Datum, FIRST(neu) as neu 
02.
GROUP BY Name 
03.
FROM tabelle;
Dann hast du alle Namen einfach... und in den anderen Feldern halt "etwas" drinstehen....

Grüße
Biber
Bitte warten ..
Mitglied: Alucard7
25.01.2010 um 18:52 Uhr
Danke für die schnelle Antwort!
Werde das demnächst ausprobieren und werd mich dann wieder melden.
Mit freundlichen Grüßen Alucard7
Bitte warten ..
Mitglied: Guenni
25.01.2010 um 21:57 Uhr
Hi Alucard7,

wieso greifst du nicht mal den Vorschlag von spytnik auf,

und versuchst es mal mit group by?

Ich habe hier eine Tabelle mit Adressdaten und habe mehreren

Leuten den gleich Vornamen verpasst.

Ein select . . . group by Vorname reduziert die Ergebnisse von x Datensätze auf y Datensätze.

Und da es dir (im Moment) egal ist, welcher Datensatz gelöscht wird . . . , (dein Zitat)

Hi, bei mir sollte der erste Datensatz komplett erhalten bleiben und die übrigen komplett ignoriert werden, im endeffekt, dann gelöscht werden, das is aber kein problem.
Ich suche nur nach einer möglichst einfachen Abfrage an die Datenbank, die diese doppelten Einträge erkennt und nur den ersten oder so, hauptsache nur einen, ausgibt.
(ob da jetzt noch nach datum oder so gegangen wird, is zurzeit noch unrelevant, hauptsache es kommt erstmal überhaupt was richtiges raus, kann man später noch nachschauen.)

. . . kannst du auf diese Weise doppelte Spalteneinträge löschen, in dem du eine Kopie der Tabelle erstellst:


01.
 
02.
create table Neue_Tabelle select * from Alte_Tabelle group by Spaltenname 
03.
 
Anschließend:

- Alte_Tabelle löschen

- Neue_Tabelle umbenennen in Alte_Tabelle


Gruß
Günni
Bitte warten ..
Mitglied: Alucard7
31.05.2010 um 13:52 Uhr
Hi, tut mir leid dass ich mich erst jetzt wieder melde, es gab einiges Umdenken bezüglich der Aufgabe.
Nachdem ich die von euch vorgeschlagene Lösung erfolgreich getestet hatte, sollte auf einmal alles mit auto inkr und so gelöst werde, da sich das doch als bessere Lösung heraus kristallisiert hatte :D. Naja jedenfalls habe ich dann damit zu tun, weshalb ich mich erst jetzt wieder melden konnte.
Dadurch brauchte ich mich halt auch nicht mehr mit group by zu behelfen
Trotzdem vielen Dank für die Hilfe ;)

Mit freundlichen Grüßen Alucard7
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (15)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...