Zeige mir alle Datensätze wo VORNAME und NACHNAME gleich ist

Soapp

Erfahrenes Mitglied
Tabelle:

Vorname -- Nachname -- Gruppe

Thomas -- Müller -- 5
Thomas -- Müller -- 6
Margit -- Baumann -- 2


Wie krieg ich es nun gebacken alle Namen die mehrfach vorkommen mit den verwschiedenen Gruppenzugehörigkeiten auszugeben.

Ich möchte also nicht speziell nach dem Müller suchen, sondern nach ALLEN namen die mehrfach vorkommen *seufz*

Profisache, oder ?
 
Wie wär es hiermit:
Code:
SELECT
  a.nachname,
  a.vorname,
  a.gruppe  
FROM Tabelle a
WHERE 1<(SELECT COUNT(*)
           FROM Tabelle b
           WHERE a.vorname=b.vorname
             AND a.nachname=b.nachname)
ORDER BY a.nachname, a.vorname
Gruß hpvw
 
hmmm, ich stell die Aufgabe noch einmal

Tabelle:
#############
Vorname - Nachname - Gruppe



Müller - Thomas - 1
Müller - Thomas - 2
Müller - Thomas - 5
Springer - Thomas - 1


Rauskommen soll:

Müller Thomas ist in Gruppe 1,2 und 5
Und das ganze soll er mir für alle Namen machen, die auch in einer anderen Gruppe sind.
Interessant sind nur die Leute, die auch in einer anderen Gruppe sind.
Springer Thomas interessiert mich hier nicht.

schwierig , oder ?

Danke

Soapp
 
Wenn ich auf die Tabelle oben angesprochenes Query anwende, erhalte ich doch das, was Du sagst:
Code:
nachname  vorname   gruppe
Müller    Thomas    1
Müller    Thomas    2
Müller    Thomas    5
Du kannst natürlich auch folgendes Query anwenden:
Code:
SELECT
  CONCAT(
    a.vorname,
    ' ',
    a.nachname,
    ' ist in Gruppe ',
    GROUP_CONCAT(a.gruppe ORDER BY a.Gruppe ASC SEPARATOR ', '),
    '.'
  ) AS Text
FROM Tabelle a
WHERE 1<(SELECT COUNT(*)
           FROM Tabelle b
           WHERE a.vorname=b.vorname
             AND a.nachname=b.nachname)
GROUP BY a.nachname, a.vorname
Das Ergebnis sieht dann so aus:
Code:
Text
Thomas Müller ist in Gruppe 1, 2, 5.
Wie Du das "und" da rein bekommst, musst Du mal schauen.

Gruß hpvw
 
hpvw hat gesagt.:
Wenn ich auf die Tabelle oben angesprochenes Query anwende, erhalte ich doch das, was Du sagst:
Code:
nachname  vorname   gruppe
Müller    Thomas    1
Müller    Thomas    2
Müller    Thomas    5
Du kannst natürlich auch folgendes Query anwenden:
Code:
SELECT
  CONCAT(
    a.vorname,
    ' ',
    a.nachname,
    ' ist in Gruppe ',
    GROUP_CONCAT(a.gruppe ORDER BY a.Gruppe ASC SEPARATOR ', '),
    '.'
  ) AS Text
FROM Tabelle a
WHERE 1<(SELECT COUNT(*)
           FROM Tabelle b
           WHERE a.vorname=b.vorname
             AND a.nachname=b.nachname)
GROUP BY a.nachname, a.vorname
Das Ergebnis sieht dann so aus:
Code:
Text
Thomas Müller ist in Gruppe 1, 2, 5.
Wie Du das "und" da rein bekommst, musst Du mal schauen.

Gruß hpvw



WIE MACHST DU DAS ?
WIe kannst du dir bitte DIESE QUERYS aus dem Gehirn raussaugen ?
Wie lange dauert das, bis ich das auch kann ?
Machst du das beruflich ?
Ich werds morgen mal ausprobieren..
Schade nur, dass ich die Query ned verstehe .. Wahnsinn

Gut Nacht
 
Soapp hat gesagt.:
WIE MACHST DU DAS ?
MIt der Tastatur ;)
Soapp hat gesagt.:
WIe kannst du dir bitte DIESE QUERYS aus dem Gehirn raussaugen ?
Mit dem Verständnis für die nötige Theorie, die hinter relationalen Datenbanken steht, dem MySQL-Handbuch und vielleicht hilft auch ein bisschen Analyse des gewünschten Ergebnis.
Soapp hat gesagt.:
Wie lange dauert das, bis ich das auch kann ?
Das kann ich Dir nicht beantworten. Mein erster Kontakt mit Datenbanken war vor 7 oder 8 Jahren in der Schule. Da ging es ausschließlich um Theorie und wir haben kein Stück mit SQL gearbeitet (das hat mir am meisten gebracht und war definitiv das wichtigste, was ich in der Schule gelernt habe). Dann habe ich mich ein bisschen mit einfachen Querys beschäftigt, dann die Datenbanken in Ruhe gelassen und mich vor ca. 4 Jahren wieder damit beschäftigt. Da das bis vor ca. einem Jahr nie besonders intensiv war, sollte man wesentlich schneller als ich damit klarkommen, wenn man es will.
Soapp hat gesagt.:
Machst du das beruflich ?
Datenbanken sind immer nur ein Hilfsmittel, in so fern: Jein.
Soapp hat gesagt.:
Ich werds morgen mal ausprobieren..
Schade nur, dass ich die Query ned verstehe .. Wahnsinn
Grundlage der relationalen Datenbanken ist die Theorie. Ich habe in diesem Forum schon mal irgendwo erwähnt, dass selbst ich, der lieber einfach loslegt und seit dem Beginn des Studiums die Schnauze voll von Theorien hat, denke, dass die Theorie bei relationalen Datenbanken unabdingbar zum Verständnis und effektiven Umgang mit selbigen ist. Ich habe auch schon mehrfach zu den Artikeln von Kelz und Moschner verlinkt, die ich sehr gut für einen nicht einfachen aber sinnvollen Einstieg halte. Auch der Artikel zur Normalisierung in der Wikipedia ist ganz gut. Danach kann man sich mit den Grundlagen der Syntax beschäftigen und die Funktionen im MySQL-Handbuch (denk' nicht, dass ich das nicht mehr brauche!) nachschlagen, um das Query zu verstehen.

Gruß hpvw
 
hpvw hat gesagt.:
Wenn ich auf die Tabelle oben angesprochenes Query anwende, erhalte ich doch das, was Du sagst:
Code:
nachname  vorname   gruppe
Müller    Thomas    1
Müller    Thomas    2
Müller    Thomas    5
Du kannst natürlich auch folgendes Query anwenden:
Code:
SELECT
  CONCAT(
    a.vorname,
    ' ',
    a.nachname,
    ' ist in Gruppe ',
    GROUP_CONCAT(a.gruppe ORDER BY a.Gruppe ASC SEPARATOR ', '),
    '.'
  ) AS Text
FROM Tabelle a
WHERE 1<(SELECT COUNT(*)
           FROM Tabelle b
           WHERE a.vorname=b.vorname
             AND a.nachname=b.nachname)
GROUP BY a.nachname, a.vorname
Das Ergebnis sieht dann so aus:
Code:
Text
Thomas Müller ist in Gruppe 1, 2, 5.
Wie Du das "und" da rein bekommst, musst Du mal schauen.

Gruß hpvw




Wieso Tabelle a und Tabelle b ? *kopfkratz*
 
Soapp hat gesagt.:
Wieso Tabelle a und Tabelle b ? *kopfkratz*
Oh ja, konklrete Fragen sind so viel besser.

Die "Tabellen" a und b sind Aliasnamen für die Tabelle, die jeweils im FROM definiert werden.
Die Syntax von MySQL erlaubt bei Tabellen, dass man das Schlüsselwort AS dazwischen wegläßt.
Das ist nötig, damit MySQL weiß, was gemeint ist. Schließlich wird zwei mal auf die Tabelle zugegriffen, einmal im Hauptquery und einmal im Subquery. Insbesondere im WHERE des Subquery muss man MySQL dann eindeutig sagen, aus welcher der (gleichen) Tabellen er die Felder nehmen soll.

Gruß hpvw
 
hpvw hat gesagt.:
Oh ja, konklrete Fragen sind so viel besser.

Die "Tabellen" a und b sind Aliasnamen für die Tabelle, die jeweils im FROM definiert werden.
Die Syntax von MySQL erlaubt bei Tabellen, dass man das Schlüsselwort AS dazwischen wegläßt.
Das ist nötig, damit MySQL weiß, was gemeint ist. Schließlich wird zwei mal auf die Tabelle zugegriffen, einmal im Hauptquery und einmal im Subquery. Insbesondere im WHERE des Subquery muss man MySQL dann eindeutig sagen, aus welcher der (gleichen) Tabellen er die Felder nehmen soll.

Gruß hpvw

Dann müsste das SO passen, oder ?

$sql = "

SELECT CONCAT( a.vorname, ' ', a.nachname, ' ist in Gruppe ', GROUP_CONCAT( a.gruppe
ORDER BY a.Gruppe ASC SEPARATOR ', ' ) , '.' ) AS Text
FROM GUESTS a
WHERE 1 < (
SELECT COUNT( * )
FROM GUESTS b
WHERE a.vorname = b.vorname
AND a.nachname = b.nachname )
GROUP BY a.nachname, a.vorname

";
$start = mysql_query($sql);
while ($row = mysql_fetch_object($start))
{
echo $row->text;
}


MySQL said: Documentation
#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '(a.gruppe ORDER BY a.Gruppe ASC SEPARATOR ', '),
'.'
)


Kann es sein dass das ganze erst abe 4.1 funktioniert ?
 
Zuletzt bearbeitet:
Soapp hat gesagt.:
Dann müsste das SO passen, oder ?

$sql = "

SELECT CONCAT( a.vorname, ' ', a.nachname, ' ist in Gruppe ', GROUP_CONCAT( a.gruppe
ORDER BY a.Gruppe ASC SEPARATOR ', ' ) , '.' ) AS Text
FROM GUESTS a
WHERE 1 < (
SELECT COUNT( * )
FROM GUESTS b
WHERE a.vorname = b.vorname
AND a.nachname = b.nachname )
GROUP BY a.nachname, a.vorname

";
$start = mysql_query($sql);
while ($row = mysql_fetch_object($start))
{
echo $row->text;
}
Ja

Soapp hat gesagt.:
MySQL said: Documentation
#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '(a.gruppe ORDER BY a.Gruppe ASC SEPARATOR ', '),
'.'
)


Kann es sein dass das ganze erst abe 4.1 funktioniert ?
Ja

Das zweite Query ist eigentlich auch nur ein bisschen Spielkram. Normalerweise lässt man sich die Daten zurückgeben und sorgt in der Anwendungssprache (hier vermutlich PHP) für die Ausgabe, ggf. mit Templates.

Das erste Query funktioniert durch das Subquery natürlich auch erst ab 4.1.

Ein Workaroud kann man mit JOIN schreiben:
Code:
SELECT DISTINCT
  a.nachname,
  a.vorname,
  a.gruppe  
FROM GUESTS a
JOIN GUESTS b
  ON a.vorname=b.vorname
    AND a.nachname=b.nachname
    AND a.gruppe!=b.gruppe
ORDER BY a.nachname, a.vorname, a.gruppe
Mit PHP liest man das dann so aus:
PHP:
<?
//DB-Verbindung
$res=mysql_query("SELECT DISTINCT
          a.nachname,
          a.vorname,
          a.gruppe  
        FROM GUESTS a
        JOIN GUESTS b
          ON a.vorname=b.vorname
            AND a.nachname=b.nachname
            AND a.gruppe!=b.gruppe
        ORDER BY a.nachname, a.vorname, a.gruppe");

$tempVorname=null;
$tempNachname=null;
$tempGruppen=array();
while ($row=mysql_fetch_assoc($res)) {
    if ($row['vorname']!=$tempVorname 
            && $row['nachname']!=$tempNachname) {
        if ($tempVorname!=null && $tempNachname!=null) {
            $gruppen=implode(', ',$tempGruppen);
            echo $tempVorname
                .' '
                .$tempNachname
                .' ist in den Gruppen '
                .$gruppen
                .'.<br/>';
        }
        $tempVorname=$row['vorname'];
        $tempNachname=$row['nachname'];
        $tempGruppen=array();
    }
    $tempGruppen[]=$row['gruppe'];
}
if ($tempVorname!=null && $tempNachname!=null) {
    $gruppen=implode(', ',$tempGruppen);
    echo $tempVorname
        .' '
        .$tempNachname
        .' ist in den Gruppen '
        .$gruppen
        .'.';
}
?>
Gruß hpvw
 

Neue Beiträge

Zurück