Tabellenfelder vergleichen
Daniel82
- datenbank
Tabelle: Nutzer
Felder: ID, Name, Vorname, Ort, Telefon, eMail
Beispieldaten:
1, Meier, Daniel, Homburg, 1234, md@mail.de
2, Werner, Thorben, München, 4321, wt@mail.de
3, Kind, Thomas, Dortmund, 3242, kt@mail.de
4, Winter, Daniel, Bremen, 7823, wd@mail.de
5, Winter, Marina, Wilhelmshaven, 3465, wm@mail.de
6, Albert, Tim, Leipzig, 5231, at@mail.de
7, Albert, Tim, Leipzig, 5231, at2@mail.de
SQL-Abfrage:
Name prüfen
$sql = "select count(*), Name, Vorname, Ort, Telefon, eMail from Nutzer group by Name having count(*) > 1";
Vorname prüfen
$sql = "select count(*), Name, Vorname, Ort, Telefon, eMail from Nutzer group by Vorname having count(*) > 1";
Problem:
1.) Beide SQL-Anweisungen bringen bei "count()" eine 2, dennoch wird nur ein Datensatz angezeigt. Wo ist mein Fehler, wie kann ich das beheben?
2.) ID 6 und 7 sind Name und Vorname gleich. Wie lautet so eine SQL-Anweisung, wenn ich Name und Vorname auf Gleichheit prüfen will?
Hallo Daniel,
Du hast zwar das verwendete Datenbankmanagementsystem nicht angegeben und eine Deiner letzten Anfragen bezog sich auf Oracle, aber
Tabelle: Nutzer
Felder: ID, Name, Vorname, Ort, Telefon, eMail
Beispieldaten:
1, Meier, Daniel, Homburg, 1234, md@mail.de
2, Werner, Thorben, München, 4321, wt@mail.de
3, Kind, Thomas, Dortmund, 3242, kt@mail.de
4, Winter, Daniel, Bremen, 7823, wd@mail.de
5, Winter, Marina, Wilhelmshaven, 3465, wm@mail.de
6, Albert, Tim, Leipzig, 5231, at@mail.de
7, Albert, Tim, Leipzig, 5231, at2@mail.de
sowas wie die nächsten beiden Statements:
$sql = "select count(*), Name, Vorname, Ort, Telefon, eMail from Nutzer group by Name having count(*) > 1";
$sql = "select count(*), Name, Vorname, Ort, Telefon, eMail from Nutzer group by Vorname having count(*) > 1";
akzeptiert außer MySQL kein mir bekanntes Datenbankmanagementsystem. Alle anderen weisen diese Abfragen als syntaktisch falsch zurück, weil Du nicht nach allen Spalten, die _keine_ Aggregatsfunktion enthalten gruppiert hast.
1.) Beide SQL-Anweisungen bringen bei "count()" eine 2, dennoch wird nur ein Datensatz angezeigt. Wo ist mein Fehler, wie kann ich das beheben?
Was bitte wäre Dein gewünschtes Ergebnis?
Erste Abfrage, Prüfung auf doppelte Familiennamen:
SELECT
Name,
COUNT(*)
FROM Nutzer
GROUP BY Name
HAVING COUNT(*) > 1
sollte zwei Datensätze zurückliefern:
Name COUNT(*)
----------------
Winter 2
Albert 2
2.) ID 6 und 7 sind Name und Vorname gleich. Wie lautet so eine SQL-Anweisung, wenn ich Name und Vorname auf Gleichheit prüfen will?
SELECT
Name,
Vorname,
COUNT(*)
FROM Nutzer
GROUP BY
Name,
Vorname
HAVING COUNT(*) > 1
liefert die Datensätze
Name Vorname COUNT(*)
----------------------
Albert Tim 2
Es ist überhaupt keine gute Idee, Spalten mitzunehmen, nach denen man _nicht_ gruppiert (oder gar nicht gruppieren kann):
Verwendet man kein MySQL, so erhält man ziemlich sicher eine Fehlermeldung
Verwendet man MySQL - und der Inhalt dieser Spalten ist bei den einzelnen Datensätzen unterschiedlich, so erhält man zufällige Ergebnisse in diesen Spalten.
Möchtest Du etwa alle Daten aller Nutzer haben, deren Name mehr als einmal vorkommt? Dann sage dies bitte auch. Es ist eine sehr gute Idee, die gewünschte Ergebnismenge anzugeben - am besten mit einer Klartextbegründung, warum man genau diese Datensätze haben möchte, z.B:
Gewünschtes Ergebnis:
4, Winter, Daniel, Bremen, 7823, wd@mail.de
5, Winter, Marina, Wilhelmshaven, 3465, wm@mail.de
6, Albert, Tim, Leipzig, 5231, at@mail.de
7, Albert, Tim, Leipzig, 5231, at2@mail.de
weil die Familennamen "Winter" und "Albert" doppelt vorkommen.
Freundliche Grüße und mit der Bitte um eine konkretere Problembeschreibung
Vinzenz
Hallo Daniel,
Du hast zwar das verwendete Datenbankmanagementsystem nicht angegeben und eine Deiner letzten Anfragen bezog sich auf Oracle, aber
Nutze MySQL!
Erste Abfrage, Prüfung auf doppelte Familiennamen:
SELECT
Name,
COUNT()
FROM Nutzer
GROUP BY Name
HAVING COUNT() > 1
>
> sollte zwei Datensätze zurückliefern:
>
> Name COUNT(\*)
> ----------------
> Winter 2
> Albert 2
Leider nicht. Bei mir steht nur "Winter" und dahinter eine "2"!
> Es ist überhaupt keine gute Idee, Spalten mitzunehmen, nach denen man \_nicht\_ gruppiert (oder gar nicht gruppieren kann):
>
> Verwendet man kein MySQL, so erhält man ziemlich sicher eine Fehlermeldung
> Verwendet man MySQL - und der Inhalt dieser Spalten ist bei den einzelnen Datensätzen unterschiedlich, so erhält man zufällige Ergebnisse in diesen Spalten.
>
> Möchtest Du etwa alle Daten aller Nutzer haben, deren Name mehr als einmal vorkommt? Dann sage dies bitte auch. Es ist eine sehr gute Idee, die gewünschte Ergebnismenge anzugeben - am besten mit einer Klartextbegründung, warum man genau diese Datensätze haben möchte
Ja, ich will gerne weitere bzw. momentan alle Daten von dem Nutzer haben, deren Name/Vorname gleich ist.
Erste Abfrage, Prüfung auf doppelte Familiennamen:
SELECT
Name,
COUNT()
FROM Nutzer
GROUP BY Name
HAVING COUNT() > 1
> >
> > sollte zwei Datensätze zurückliefern:
> >
> > Name COUNT(\*)
> > ----------------
> > Winter 2
> > Albert 2
>
> Leider nicht. Bei mir steht nur "Winter" und dahinter eine "2"!
>
Hattest doch recht. Hatte mich in deinem Posting verlesen!
Hallo Daniel,
Beispieldaten:
ID Name Vorname Ort Telefon eMail
------------------------------------------------------------
1 Meier Daniel Homburg 1234 md@example.org
2 Werner Thorben München 4321 wt@example.org
3 Kind Thomas Dortmund 3242 kt@example.org
4 Winter Daniel Bremen 7823 wd@example.org
5 Winter Marina Wilhelmshaven 3465 wm@example.org
6 Albert Tim Leipzig 5231 at@example.org
7 Albert Tim Leipzig 5231 at2@example.org
Anmerkung: Für Beispieldaten sind die Domains
example.org, example.com, example.net
vorgesehen. Es wäre eine gute Idee, in Zukunft bei Beispieldaten
diese zu verwenden.
SELECT
Name,
COUNT()
FROM Nutzer
GROUP BY Name
HAVING COUNT() > 1
> >
> > sollte zwei Datensätze zurückliefern:
> >
> > Name COUNT(\*)
> > ----------------
> > Winter 2
> > Albert 2
> Ja, ich will gerne weitere bzw. momentan alle Daten von dem Nutzer haben, deren Name/Vorname gleich ist.
Du möchtest also die Details zu diesen Nutzern haben. Das geht mit einer [korrelierten Unterabfrage](http://dev.mysql.com/doc/refman/4.1/en/correlated-subqueries.html). MySQL unterstützt Unterabfragen ab Version 4.1.
~~~sql
SELECT
ID, -- Liste der gewünschten Details
Name,
Vorname,
Ort,
Telefon,
eMail
FROM Nutzer
WHERE Name IN ( -- von den Datensätzen, bei denen der Name
SELECT -- in der Liste
Name -- der Namen
FROM Nutzer -- der Nutzer vorkommt,
GROUP BY Name
HAVING COUNT(*) > 1 -- die häufiger als einmal vorkommen
)
liefert mit den Beispieldaten als Ergebnis
ID Name Vorname Ort Telefon eMail
------------------------------------------------------------
4 Winter Daniel Bremen 7823 wd@example.org
5 Winter Marina Wilhelmshaven 3465 wm@example.org
6 Albert Tim Leipzig 5231 at@example.org
7 Albert Tim Leipzig 5231 at2@example.org
wobei die Datensätze in einer zufälligen Reihenfolge auftreten können, da keine Sortierung vorgegeben ist.
Getestet mit MySQL 4.1.18 und MS SQL-Server 2005.
Grundsätzlich empfehle ich Dir, Dich in SQL einzuarbeiten, damit Du auch verstehst, was Du machst. Die Lektüre der Handbücher des gerade verwendeten Datenbankmanagementsystems ist dabei durchaus lehr- und hilfreich.
Freundliche Grüße
Vinzenz
Super super. Genau das meinte ich und es funktioniert!
Danke!!!
SELECT
ID, -- Liste der gewünschten Details
Name,
Vorname,
Ort,
Telefon,
eMail
FROM
Nutzer
WHERE
Name IN
( -- von den Datensätzen, bei denen der Name
SELECT -- in der Liste
Name -- der Namen
FROM
Nutzer -- der Nutzer vorkommt,
GROUP BY
Name
HAVING
(COUNT(*) > 1) -- die häufiger als einmal vorkommen
)
So, so, auch noch getestet.
Weihnachtsmann! ;)
Die Anforderung muss immer möglichst präzise beschrieben sein. Daran mangelt es bei dieser Problemfrage.
Wenn es angefordert sein sollte Dubletten an Hand bestimmter Kriterien zu identifizieren, dann könnte mit Unterabfragen gearbeitet werden, bspw. mit einem GROUP BY und HAVING in der Unterabfrage die Dublettenkriterien bündeln und in der Hauptabfrage diese Kriterien in einem WHERE referenzieren. Dann kämen die Kandidaten für die möglicherweise angestrebte "manuelle" Behandlung hoch.
"Möglicherweise" - wir sehen also, dass irgendetwas fehlt bei der (scheinbaren?) Problemfrage, die vielleicht folgende Konzeptfrage ist: Dubletten killen, wie geht das?
Die Anforderung muss immer möglichst präzise beschrieben sein. Daran mangelt es bei dieser Problemfrage.
Wenn es angefordert sein sollte Dubletten an Hand bestimmter Kriterien zu identifizieren, dann könnte mit Unterabfragen gearbeitet werden, bspw. mit einem GROUP BY und HAVING in der Unterabfrage die Dublettenkriterien bündeln und in der Hauptabfrage diese Kriterien in einem WHERE referenzieren. Dann kämen die Kandidaten für die möglicherweise angestrebte "manuelle" Behandlung hoch.
"Möglicherweise" - wir sehen also, dass irgendetwas fehlt bei der (scheinbaren?) Problemfrage, die vielleicht folgende Konzeptfrage ist: Dubletten killen, wie geht das?
Habe meine Frage genauer gestellt in einem weiteren Eintrag in diesem Thread!
"Möglicherweise" - wir sehen also, dass irgendetwas fehlt bei der (scheinbaren?) Problemfrage, die vielleicht folgende Konzeptfrage ist: Dubletten killen, wie geht das?
Habe meine Frage genauer gestellt in einem weiteren Eintrag in diesem Thread!
Meinst Du "Ja, ich will gerne weitere bzw. momentan alle Daten von dem Nutzer haben, deren Name/Vorname gleich ist." aus https://forum.selfhtml.org/?t=144412&m=937169 ?
LOL
Einfachheit ist ein wichtiges, vielleicht das wichtigste, nein, sicher das Wichtigste Prinzip der IT, aber Einfachheit ist nicht zu verwechseln mit Abkürzungen, also Versuchen Sachverhalte auf etwas zu reduzieren, die nur esoterisch verstanden werden.
Also:
"Möglicherweise" - wir sehen also, dass irgendetwas fehlt bei der (scheinbaren?) Problemfrage, die vielleicht folgende Konzeptfrage ist: Dubletten killen, wie geht das?
Habe meine Frage genauer gestellt in einem weiteren Eintrag in diesem Thread!
Meinst Du "Ja, ich will gerne weitere bzw. momentan alle Daten von dem Nutzer haben, deren Name/Vorname gleich ist." aus https://forum.selfhtml.org/?t=144412&m=937169 ?
LOL
Einfachheit ist ein wichtiges, vielleicht das wichtigste, nein, sicher das Wichtigste Prinzip der IT, aber Einfachheit ist nicht zu verwechseln mit Abkürzungen, also Versuchen Sachverhalte auf etwas zu reduzieren, die nur esoterisch verstanden werden.
Also:
- Möglichst vollständig die Anforderung beschreiben (gerne auch unter Angabe des Entwicklungsziels)!
- Ab- und Verkürzungen dabei meiden! Wir sind ja hier nicht alle eingeweiht in die Problematik, auch wenn diese eine Vorgeschichte haben sollte.
- Konntest Du mit dem (etwas spekulativen ;) Lösungsvorschlag etwas anfangen?
Was ist daran kurz oder wo sind da Abkürzungen?
Ich möchte halt von den doppelten Namen alle Datensätze haben, wie Vorname, Ort, Telefon, eMail. Was ist daran schwer zu verstehen?
Was ist daran kurz oder wo sind da Abkürzungen?
Ich möchte halt von den doppelten Namen alle Datensätze haben, wie Vorname, Ort, Telefon, eMail. Was ist daran schwer zu verstehen?
Konntest Du mit dem (etwas spekulativen ;) Lösungsvorschlag etwas anfangen?
Nein, weil es alles das ist, was ich weiß.
Leider war aus meiner Sicht kein konkreter oder spekulativer Vorschlag drin. Daher auch mein Beitrag danach!
Nein, weil es alles das ist, was ich weiß.
Leider war aus meiner Sicht kein konkreter oder spekulativer Vorschlag drin. Daher auch mein Beitrag danach!
Sagt Dir "Unterabfrage" irgendetwas?