Gefilterte Datenbankabfrage
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:
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!
mfg Alucard7
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:
$query = "SELECT DISTINCT `name`,`medium`,`datum`,`neu` FROM `$db` ORDER BY name;";
Könnte mir jemand zeigen, wie ich die Abfrage verändern muss, damit ich das gewünschte Ergebnis erhalte?
Danke!
mfg Alucard7
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
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".
Ich setze es daher aus "Gelöst" und, weil ich hier keinen Take-Over irgendwann haben möchte, auf "Geschlossen".
Content-ID: 134153
Url: https://administrator.de/forum/gefilterte-datenbankabfrage-134153.html
Ausgedruckt am: 21.04.2025 um 10:04 Uhr
11 Kommentare
Neuester Kommentar

DISTINCT bezieht sich auf den SELECT und nicht die Spalten. Versuche es mit einem GROUP BY.
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:
Allerdings kollidiert diese Befürchtung mit deinem Satz
Hoffe also, ich liege falsch.
Grüße
Biber
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:
$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
Moin Alucard7,
Gottseidank.
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:
Grüße
Biber
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.
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
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
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
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
Dann hast du alle Namen einfach... und in den anderen Feldern halt "etwas" drinstehen....
Grüße
Biber
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
SELECT name, FIRST(medium) as Medium, First(Datum) as Datum, FIRST(neu) as neu
GROUP BY Name
FROM tabelle;
Dann hast du alle Namen einfach... und in den anderen Feldern halt "etwas" drinstehen....
Grüße
Biber
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)
. . . kannst du auf diese Weise doppelte Spalteneinträge löschen, in dem du eine Kopie der Tabelle erstellst:
Anschließend:
- Alte_Tabelle löschen
- Neue_Tabelle umbenennen in Alte_Tabelle
Gruß
Günni
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.)
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:
create table Neue_Tabelle select * from Alte_Tabelle group by Spaltenname
Anschließend:
- Alte_Tabelle löschen
- Neue_Tabelle umbenennen in Alte_Tabelle
Gruß
Günni