php select-anweisung: datensätze mit selben namen auswählen
janosch
- php
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
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
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
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
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
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
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
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