janosch: php select-anweisung: datensätze mit selben namen auswählen

kann ich datensätze auslesen, bei denen  namen doppelt vorkommen?

ca. so:
SELECT * FROM $k_table WHERE namen LIKE '%doppelte_namen%';

naja so gehts net. verstehe. aber gibts das, denn ich will alle datensätze auslesen bei denen  namen doppelt vorkommen.

janosch

  1. Hallo,

    mit einer Schleife in einer Schleife.

    Also du fragst deine Datenbank ab:
    SELECT * FROM $k_table
    ...
    while(...)
    {
    //Dann kommt die nächste Abfrage

    $abfrage = "SELECT * FROM $k_table WHERE name LIKE '$row->name'";
    ....

    $result = mysql_query($abfrage);
    $menge = mysql_num_rows($result);

    if($menge >= 2)
    {

    while(...)
      {
      echo "Ausgabe";
      }
    }

    }

    Also du fragst zuerst die ganze Datenbank ab. In dieser Whileschleife fragst du die Datenbank nochmal ab, aber mit WHERE name LIKE '$row->name'

    $row->name soll der Inhalt/Wert von name (Feld) sein, ich weiß ja nicht wie du eine DB abfragst.

    Durch diese WHERE Abfrage zeigt der die alle Werte an, die den Gleichen Inhalt haben.
    Danach zählst du, wieviele Werte es sind ($menge)

    Wenn $menge größer als 2 ist, gibt er dir "Ausgabe" aus ;)

    Alles verstanden?

    MFG
    Andavos

    --
    http://www.rpgcommunity.de/clanwissen/index.php Webdesign, PHP, Clan-Aufbau und mehr
    1. Hello,

      mit einer Schleife in einer Schleife.

      Da müsste man dann so eine Art "Sieb des Eratostenes" aufbauen für Datensatz-Doubletten.

      Musst Du mal googlen.

      Liebe Grüße aus http://www.braunschweig.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
  2. Hallo janosch!

    kann ich datensätze auslesen, bei denen  namen doppelt vorkommen?
    SELECT * FROM $k_table WHERE namen LIKE '%doppelte_namen%';

    Schau Dir mal http://www.mysql.com/doc/en/String_comparison_functions.html nochmal an, eigentlich sollte es auch mit LIKE gehen.
    (Ich sehe bei dir grad keinen Fehler, aber laß dir doch den MySQL-Fehler ausgeben, dann siehst Du vielleicht, wo das Problem genau liegt.)

    Ansonsten ist SELECT * auch nur dann sinnvoll, wenn Du _wirklich_ _alle_ Felder brauchst.

    MfG
    Götz

    --
    Losung und Lehrtext für Mittwoch, 21. Januar 2004
    Gideon sprach zu dem Engel des Herrn: Ist der Herr mit uns, warum ist uns dann das alles widerfahren? (Richter 6,13)
    Jesus war hinten im Boot und schlief auf einem Kissen. Und sie weckten ihn auf und sprachen zu ihm: Meister, fragst du nichts danach, dass wir umkommen? (Markus 4,38)
    (http://www.losungen.de/heute.php3)
  3. Moin!

    kann ich datensätze auslesen, bei denen  namen doppelt vorkommen?

    Klar. Gruppieren und filtern mit HAVING.

    Damit kriegst du allerdings nicht die einzelnen Datensätze raus, sondern eben nur die Namen, von denen es mehr als einen gibt. An die Datensätze selbst kommst du schätzungsweise auf einfache Weise nur, indem du sie nochmal separat abfragst[1]

    ca. so:
    SELECT * FROM $k_table WHERE namen LIKE '%doppelte_namen%';

    Eher so:
    SELECT namensfeld, count(namensfeld) as zahl FROM table GROUP BY namensfeld HAVING zahl > 1;

    [1] Sicherlich ist auch irgendein komplexes Auf-sich-selbst-JOIN möglich - aber ist es sinnvoll?
     - Sven Rautenberg

    --
    Die SelfHTML-Developer sagen Dankeschön für aktuell 21335,05 Euro Spendengelder!
    1. yo,

      [1] Sicherlich ist auch irgendein komplexes Auf-sich-selbst-JOIN möglich - aber ist es sinnvoll?

      SELECT namensfeld, andere_spalten
      FROM table
      WHERE namesfeld IN
         (SELECT namensfeld FROM table
          GROUP BY namensfeld
          HAVING Count(namensfeld) > 1
         );

      aber nicht besonders performant und auch nicht jedes DBMS kann unterabfragen. deshalb ist wohl dein weg über 2 abfragen vorzuziehen. hauptsache sein namen sind atomar und er muss nicht erst noch mit dem LIKE operieren, was ich fast befürchte bei seinen fragen zuvor über das LIKE.

      Ilja

    2. soweit hat alles geklappt. geht auch:

      SELECT * , count(name) as zahl, count(vorname) as zahl2 FROM $k_table GROUP BY name HAVING zahl > 1 AND zahl2 > 1;"

      wenn ich zwei felder auf doppelte prüfen will?

      janosch

      1. Moin!

        soweit hat alles geklappt. geht auch:

        Nein, geht NICHT.

        Da kommt vielleicht ein Ergebnis raus, aber keinesfalls ein definiertes Ergebnis.

        SELECT * , count(name) as zahl, count(vorname) as zahl2 FROM $k_table GROUP BY name HAVING zahl > 1 AND zahl2 > 1;"

        Du kannst kein SELECT * machen, wenn du GROUP BY benutzt.

        GROUP BY untersucht die angegebenen Felder auf Identitäten. Werden zwei Datensätze gefunden, die in diesen beiden Feldern identisch sind, werden sie zu einem zusammengefaßt.

        Also beispielsweise beim Nachname/Vorname:
        Meier, Andreas
        Meier, Willem

        Diese beiden haben identische Nachnamen, werden also mit GROUP BY zu einem Datensatz zusammengefaßt. Aber welcher Vorname wird genommen?

        Normale Datenbanken geben bei SELECT * (oder auch nur SELECT vorname) in diesem Fall einen Fehler aus, weil du nicht definiert hast, welchen der beiden Daten du geliefert haben willst. MySQL sucht sich _irgendeinen_ existierenden und von der Verdopplung betroffenen Datensatz aus! Wenn ich es richtig erinnere, sogar mit der Möglichkeit, bei weitere existierenden Feldern Daten aus ganz anderen Datensätzen zu nehmen. Du hast also das große Lotteriespiel!

        Deshalb ist es ernstgemeint: Wenn du nicht nur die doppelten Namen wissen willst, sondern auch die korrekten, dazugehörigen Datensätze, mußt du in der Tat zwei SQL-Abfragen machen: Einmal alle doppelten Namen, und mit diesen Namen dann je Name eine weitere Abfrage nach allen entsprechenden Datensätzen. Bedenke: Es ist gerade bei Namen absolut normal, wenn Dopplungen auftreten - ist die Frage, was du mit dieser Information überhaupt anfangen willst, bzw. was mit den ermittelten Datensätzen passieren soll.

        wenn ich zwei felder auf doppelte prüfen will?

        Dann machst du ein SELECT auf alle Felder, die in den beiden (drei, vier,...) Datensätzen 100% übereinstimmen sollen, und schreibst diese allesamt auch ins GROUP BY.

        SELECT name, vorname, count(name) as zahl FROM tabelle GROUP BY name, vorname HAVING zahl > 1;

        Bitte: _Keinerlei_ SELECT * reinfummeln. Du kriegst damit wirklich nur Müll geliefert - auch wenn das Ergebnis supertoll aussehen mag, und du mit kleinen Testdaten wirklich scheinbar toll-verläßliche Datensätze ausgewählt kriegst.

        Wenn du wirklich wissen willst, wer sich hinter den Datensätzen versteckt, mußt du mit jedem auf die obige Weise gewonnenen Datensatz eine weitere Abfrage machen:

        SELECT name, vorname, feld3, feld4, feld5 FROM tabelle WHERE name = "gefundener_name" AND vorname = "gefundener_vorname";

        Zu "SELECT *" lies bitte:
        http://www.dclp-faq.de/q/q-sql-select.html

        - Sven Rautenberg

        --
        Die SelfHTML-Developer sagen Dankeschön für aktuell 21335,05 Euro Spendengelder!