&SQL: SELECT * FROM X WHERE wert beginnt mit A, B, C...
Mortimer
- php
Hi
Ich möchte eine Anfangsbuchstabensortierte Aufteilung machen.
Ich habe viele viele Usernamen und möchte die Sortierung wie folgt tätigen:
A________________________________
Achim
Anrold
Axim...
B________________________________
Bertram
Bobby
etc. ihr wisst wie ich es meine.
Ich habe im endeffekt vor nicht nur unter einander sondern sie auch nebenbeinander in 4 Spalten zu gliedern.
Nun frage ich mich natürlich: Wie am besten.
Als erstes würde ich halt gerne wissen ob man nach dem Anfangsbuchstaben selektieren kann (Vorsicht: Ich meine nicht sortieren!). Sprich: SELECT * FROM X WHERE username ~START WITH A~
Danach denke ich wäre es leicht (Dividieren durch 4 in ein Array o.ä., evtl klug runden, ausgeben)...
Nur das mit dem anfangsbuchstabne ist halt nur der knackpunkt! Weiss jemand ob das geht?
ciao
wie wäre es, wenn du sie erst einmal ALLE auslesen und sortiert in ein Array schreibst?
Dann hättest du ein Array und könntest dann in einer foreach-Schleife per strlen() und substr() herausfinden was der Anfangsbuchstabe ist. Und sobald der Anfangsbuchstabe sich ändert kannst du dann dein "\n------------------A---------------\n" etc. ausgeben.
Verstehst wie ich mein?
Du brauchst das ja nicht mit MySQL auszugeben, was afaik sowieso nicht geht, weil du ja bei der Ausgabe was einfügen möchtest.
Frag einfach ncohmal wenn dus nicht verstanden hast, hört sich n bissl kompliziert an ;-)
Die Technik alles in ein Array zu packen hatte ich auch angestrebt...
Ich habe mir überlegt 26Array zu via while zu erstellen und in diese die gesamten user mit denb buchstaben zu werfen... aber ich kann mit array nicht so gut jonglieren und hadere daher noch an der umsetzung...
Kannst du nochmal erklären wie du das meinst?
Evtl. mit einer codeansicht für die hauptaufgabe (musst nicht voll ausschreiben, nur so dass ich sehe welche funktionen du benutzt und in welcher rheienfolge)
lieben griss
ciao
mortimer
Du macht zuerst die MySQL-Abfrageergebnisse in ein Array, als wolltest du es normal per Schleifer ausgeben, z.B. mit der Abfrage:
// Connecten zur DB
$query_getuser_query = "SELECT username FROM userdaten ORDER BY username DESC;";
$query_getuser = mysql_query("$query_getuser_query");
/////dann schreibst du das ganze in ein array:
$alleimarray = array[];
while( $row = mysql_fetch_assoc ( $query_getuser ) )
{
$alleimarray .= $row['username'];
}
///// So, un nu in einer foreach-Schleife ausgeben ud Prüfen
echo "<b>-----A-----</b>\n<br />\n<br />"; //Für die mit den A's weil das ja die ersten sind
$aktuelleranfangsbuchstabe = "a";
foreach ($alleimarray as $eins)
{
$dieseranfangsbuchstabe = substr($eins,0,1);
if ($dieseranfangsbuchstabe != $aktuelleranfangsbuchstabe)
{
echo "<br>\n<br>\n<br>\n<b>--------$dieseranfangsbuchstabe----------</b><br>\n<br>\n";
}
echo $eins."<br>\n";
$aktuelleranfangsbuchstabe = $dieseranfangsbuchstabe;
}
/// Und fertig !
yo,
Ich habe mir überlegt 26Array zu via while zu erstellen und in diese die gesamten user mit denb buchstaben zu werfen...
das wäre zu umständlich, dafür extra 26 arrays zu bauen. du brauchst an sich gar keines. das erste, was du machst, ist alle datensätze mit einer sortierung einlesen.
SELECT username,.....spalten
FROM tabelle
ORDER BY username
dann hast du mit einer abfrage erst mal alle datensätze abgerufen, die du brauchst. dann benötigst du noch eine variable, die den anfangsbucghstaben des jeweils letzten datensatz speichert. diesen vergleicht du mit den anfangsbuchstaben des neues datensatz in der while schleife, die die datensätze der abfrage durchgeht. nun gibt es zwei ergebnisse, an denen du verzeigen kannst:
der vergleich ist true, oder mit worten ausgedrückt der anfangbuchstabe hat sich noch nicht geändert.
der vergleich ist false und damit fängt auch eine neue gruppe an.
je nachdem wie du die ausgabe gestallten willst, kannst du entsprechenden porgrammcode schreiben
Ilja
na das sag ich doch ;-)
yo,
na das sag ich doch ;-)
man kann aber auf das array und somit einen kompletten schleifendurschlauf verzichten...
Ilja
korrekt, weil ma ja schon ne schöleife hat, in der das array gefüllt wird, ist mir schin klar ;.-)
Aber ich woillts eben übersichtlich machen...
yo,
korrekt, weil ma ja schon ne schöleife hat, in der das array gefüllt wird, ist mir schin klar ;.-)
es wird kein array gefüllt....
Ilja
Servus,
versuchs doch mal damit:
SELECT * FROM X WHERE username LIKE "A%"
dann gibt er alle daten aus, die mit A beginnen - Zu dem Sternchen bei SELECT * ist es besser gleich die Spalten hinzuschreiben (Risikofaktor und DB-Geschwindigkeit)
Ciao Morpheuz
hi,
Zu dem Sternchen bei SELECT * ist es besser gleich die Spalten hinzuschreiben (Risikofaktor und DB-Geschwindigkeit)
der hinweis ist ja schön und gut - aber
versuchs doch mal damit:
SELECT * FROM X WHERE username LIKE "A%"dann gibt er alle daten aus, die mit A beginnen -
ist unfug, wenn er die datensätze zu allen buchstaben auf einer seite darstellen will - unperformant und blödsinnig, dafür 26 queries zu machen.
dann lieber den vorschlag von "hab ich vergessen" befolgen, und einen gruppenwechsel (*) bei der ausgabe implementieren.
gruß,
wahsaga
(*) gutes suchstichwort