alucard7
Goto Top

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:
$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!

mfg Alucard7
Kommentar vom Moderator Biber am Jun 01, 2010 um 06: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".

Content-Key: 134153

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

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

Mitglied: 48507
48507 Jan 23, 2010 at 14:59:30 (UTC)
Goto Top
DISTINCT bezieht sich auf den SELECT und nicht die Spalten. Versuche es mit einem GROUP BY.
Member: Biber
Biber Jan 23, 2010 at 19:02:11 (UTC)
Goto Top
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:
$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
Member: Alucard7
Alucard7 Jan 23, 2010 at 20:03:31 (UTC)
Goto Top
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.
Member: Biber
Biber Jan 24, 2010 at 17:10:26 (UTC)
Goto Top
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
Member: Alucard7
Alucard7 Jan 25, 2010 at 00:27:49 (UTC)
Goto Top
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.
mfg Alucard7
Member: Biber
Biber Jan 25, 2010 at 05:57:21 (UTC)
Goto Top
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
Member: Alucard7
Alucard7 Jan 25, 2010 at 15:20:36 (UTC)
Goto Top
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.
mfg Alucard7
Member: Biber
Biber Jan 25, 2010 at 16:05:39 (UTC)
Goto Top
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
 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
Member: Alucard7
Alucard7 Jan 25, 2010 at 17:52:47 (UTC)
Goto Top
Danke für die schnelle Antwort!
Werde das demnächst ausprobieren und werd mich dann wieder melden.
mfg Alucard7
Member: Guenni
Guenni Jan 25, 2010 at 20:57:49 (UTC)
Goto Top
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:


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
Member: Alucard7
Alucard7 May 31, 2010 at 11:52:27 (UTC)
Goto Top
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 face-smile
Trotzdem vielen Dank für die Hilfe ;)

mfg Alucard7