tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
10
ZUGRIFFE
501
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Soapp Soapp ist offline Mitglied Brokat
    Registriert seit
    Aug 2005
    Beiträge
    277
    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 ?
     

  2. #2
    Registriert seit
    Apr 2002
    Ort
    HH
    Beiträge
    3.224
    Wie wär es hiermit:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    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
     
    Warum gibt (fast) keiner im Datenbankforum an, welches DBMS er benutzt?
    Ich gehe im Zweifelsfall ohne Nachfrage von MySQL > 4.1 i.V.m. PHP aus.
    Gewöhnt euch bitte auch an, die Fehlermeldung von mysql_error() zu posten.

  3. #3
    Soapp Soapp ist offline Mitglied Brokat
    Registriert seit
    Aug 2005
    Beiträge
    277
    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
     

  4. #4
    Registriert seit
    Apr 2002
    Ort
    HH
    Beiträge
    3.224
    Wenn ich auf die Tabelle oben angesprochenes Query anwende, erhalte ich doch das, was Du sagst:
    Code :
    1
    2
    3
    4
    
    nachname  vorname   gruppe
    Müller    Thomas    1
    Müller    Thomas    2
    Müller    Thomas    5
    Du kannst natürlich auch folgendes Query anwenden:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    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 :
    1
    2
    
    Text
    Thomas Müller ist in Gruppe 1, 2, 5.
    Wie Du das "und" da rein bekommst, musst Du mal schauen.

    Gruß hpvw
     
    Warum gibt (fast) keiner im Datenbankforum an, welches DBMS er benutzt?
    Ich gehe im Zweifelsfall ohne Nachfrage von MySQL > 4.1 i.V.m. PHP aus.
    Gewöhnt euch bitte auch an, die Fehlermeldung von mysql_error() zu posten.

  5. #5
    Soapp Soapp ist offline Mitglied Brokat
    Registriert seit
    Aug 2005
    Beiträge
    277
    Zitat Zitat von hpvw
    Wenn ich auf die Tabelle oben angesprochenes Query anwende, erhalte ich doch das, was Du sagst:
    Code :
    1
    2
    3
    4
    
    nachname  vorname   gruppe
    Müller    Thomas    1
    Müller    Thomas    2
    Müller    Thomas    5
    Du kannst natürlich auch folgendes Query anwenden:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    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 :
    1
    2
    
    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
     

  6. #6
    Registriert seit
    Apr 2002
    Ort
    HH
    Beiträge
    3.224
    Zitat Zitat von Soapp
    WIE MACHST DU DAS ?
    MIt der Tastatur
    Zitat Zitat von Soapp
    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.
    Zitat Zitat von Soapp
    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.
    Zitat Zitat von Soapp
    Machst du das beruflich ?
    Datenbanken sind immer nur ein Hilfsmittel, in so fern: Jein.
    Zitat Zitat von Soapp
    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
     
    Warum gibt (fast) keiner im Datenbankforum an, welches DBMS er benutzt?
    Ich gehe im Zweifelsfall ohne Nachfrage von MySQL > 4.1 i.V.m. PHP aus.
    Gewöhnt euch bitte auch an, die Fehlermeldung von mysql_error() zu posten.

  7. #7
    Soapp Soapp ist offline Mitglied Brokat
    Registriert seit
    Aug 2005
    Beiträge
    277
    Zitat Zitat von hpvw
    Wenn ich auf die Tabelle oben angesprochenes Query anwende, erhalte ich doch das, was Du sagst:
    Code :
    1
    2
    3
    4
    
    nachname  vorname   gruppe
    Müller    Thomas    1
    Müller    Thomas    2
    Müller    Thomas    5
    Du kannst natürlich auch folgendes Query anwenden:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    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 :
    1
    2
    
    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*
     

  8. #8
    Registriert seit
    Apr 2002
    Ort
    HH
    Beiträge
    3.224
    Zitat Zitat von Soapp
    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
     
    Warum gibt (fast) keiner im Datenbankforum an, welches DBMS er benutzt?
    Ich gehe im Zweifelsfall ohne Nachfrage von MySQL > 4.1 i.V.m. PHP aus.
    Gewöhnt euch bitte auch an, die Fehlermeldung von mysql_error() zu posten.

  9. #9
    Soapp Soapp ist offline Mitglied Brokat
    Registriert seit
    Aug 2005
    Beiträge
    277
    Zitat Zitat von hpvw
    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 ?
    Geändert von Soapp (25.10.05 um 10:24 Uhr)
     

  10. #10
    Registriert seit
    Apr 2002
    Ort
    HH
    Beiträge
    3.224
    Zitat Zitat von Soapp
    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

    Zitat Zitat von Soapp
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    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-Code:
    <?
    //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
     
    Warum gibt (fast) keiner im Datenbankforum an, welches DBMS er benutzt?
    Ich gehe im Zweifelsfall ohne Nachfrage von MySQL > 4.1 i.V.m. PHP aus.
    Gewöhnt euch bitte auch an, die Fehlermeldung von mysql_error() zu posten.

  11. #11
    Soapp Soapp ist offline Mitglied Brokat
    Registriert seit
    Aug 2005
    Beiträge
    277
    Zitat Zitat von hpvw
    Ja

    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    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-Code:
    <?
    //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



    Danke, mit dem JOIN gehts
     

Ähnliche Themen

  1. Zeige mir alle Daten, die älter sind als 7 Tage
    Von kayut im Forum Relationale Datenbanksysteme
    Antworten: 3
    Letzter Beitrag: 06.02.10, 20:42
  2. VISTA: Alle Ordner sollen gleich aussehen
    Von PhoenixDH im Forum Microsoft Windows
    Antworten: 2
    Letzter Beitrag: 16.07.08, 12:05
  3. Antworten: 5
    Letzter Beitrag: 01.06.08, 14:11
  4. Antworten: 4
    Letzter Beitrag: 16.11.07, 13:26
  5. MovieClip in alle Richtungen gleich skalieren
    Von ali-gator im Forum Flash Plattform
    Antworten: 4
    Letzter Beitrag: 08.05.07, 15:17