Datenbankausgabe alphabetisch auf mehreren Seiten ausgeben

greenslot

Mitglied
Hallo zusammen,

ich suche eine Anleitung, Skript oder Tutorial, welches mir erklärt, wie ich Datensätze alphabetisch auf mehrere (A, B, C...) Seiten ausgebe.


Etwas detaillierter:

Ich habe eine unsortierte Liste in einer Tabelle mit den Spalten Vor- und Nachname.
Vor- und Nachname sollen nach dem Anfangsbuchstaben von "Nachname" sortiert werden und für jeden Anfangsbuchstaben soll ein passender Link erstellt werden und beim Klick auf den Anfangsbuchstaben sollen nur die Namen mit dem Buchstaben gelistet werden.


So sollte das dann aussehen:

A B F S
- Alexander Fleiß
- Stefan Friedrich
- Marco Fro
 
Du prüfst beim Aufruf der Seite ob ein Buchstaben übergeben wurde oder nicht und gestaltest dementsprechend die Abfrage der Daten

PHP:
$sql = "SELECT * FROM adressen ";
if (isset($_GET["buchstabe"])) {
    $sql .= "WHERE nachname LIKE '" .mysql_real_escape_string($_GET["buchstabe"]) ."%' ";
}
$sql .= "ORDER BY nachname, vorname";

Die Links müssen dann so aussehen:
HTML:
<a href="deineseite.php?buchstabe=A">A</a>
<a href="deineseite.php?buchstabe=B">B</a>
<a href="deineseite.php?buchstabe=C">C</a>
 
Zuletzt bearbeitet:
Jetzt kommt das knifflige. Ist der Nachname 'von Flüh' jetzt unter v oder unter F einzuordnen?
Nach tombes SQL ist er weder noch, da das v != V ist findet das Script das 'v' von nicht und das 'F' von Flüh steht nicht zuvorderst.

Wenn es unter V sein soll, unbedingt beide Seiten im WHERE noch in UPPER() fassen
PHP:
 $sql .= "WHERE UPPER(nachname) LIKE '" .mysql_real_escape_string(strtoupper($_GET["buchstabe"])) ."%' ";
 
Ach, das ist ja ganz einfach.

Kann man davor eine Abfrage packen, die abfragt, welche Anfangsbuchstaben vorhanden sind, so dass nur Links zu Buchstaben erstellt werden, die es in der Datenbank auch gibt?
Oder wäre das zuviel arbeit für die Datenbank, wenn da jedes Mal eine Abfrage gestartet werden müsste, wenn z.B. 500 Einträge vorhanden sind?
 
500 Einträge ist nicht viel. Ab 100'000 können wir langsam von viel reden.

SQL:
SELECT DISTINCT
    LEFT(nachname, 1) AS letter
FROM
    adressen
ORDER BY
    LEFT(nachname, 1)

ps. Hast du meinen Beitrag weiter oben gesehen? Mach dir mal Gedanken über diese Problematik.
 
Zuletzt bearbeitet von einem Moderator:
@Yaslaw
Nach Voreinstellung unterscheiden Suchoperationen in MySQL nicht zwischen Groß- und Kleinschreibung (wobei allerdings manche Zeichensätze grundsätzlich immer zwischen Groß- und Kleinschreibung unterscheiden, wie beispielsweise czech). Das bedeutet, dass Sie bei einer Suche mit col_name LIKE 'a%' alle Spaltenwerte geliefert bekommen, die mit A oder a anfangen. Wenn Sie diese Suche auf Groß- oder Kleinbuchstaben einschränken möchten, müssen Sie dafür sorgen, dass die Kollation eines der beiden Operanden Groß- und Kleinschreibung unterscheidet oder eine Binärkollation ist. Wenn Sie beispielsweise eine Spalte und einen String vergleichen, die beide den Zeichensatz latin1 verwenden, können Sie den COLLATE-Operator einschalten, um einem der beiden Operanden die Kollation latin1_general_cs oder latin1_bin zuzuweisen.

Das was da oben steht, stammt von der mySQL Homepage.

Somit dürfte auch der Name "von Flüh" keine Probleme machen!
 
500 Einträge ist nicht viel. Ab 100'000 können wir langsam von viel reden.

SQL:
SELECT DISTINCT
    LEFT(nachname, 1) AS letter
FROM
    adressen
ORDER BY
    LEFT(nachname, 1)

ps. Hast du meinen Beitrag weiter oben gesehen? Mach dir mal Gedanken über diese Problematik.


Hallo,
ja, habe ich gesehen. Ich glaube, soviel Nachnamen mit "von" werden da nicht auftauchen.

Mit der SELECT Abfrage werden jetzt die ersten Buchstaben abgefragt und diese kann ich dann ganz normal ausgeben bzw. es werden nur die ausgegeben, die auch gefunden werden?

Ich kann das erst heute Abend testen.
 
Zuletzt bearbeitet von einem Moderator:
@tombe
Eine sehr unschöne Sache sowas. Unsauber von MySQL das so zu handhaben.

Gut, unter V erscheint es dann und das UPPER ist nicht notwendig.

@greenslot
Jepp, alle gefundenen Anfangsbuchstaben (Jeder Buchstabe nur einmal) in alphabetischer Reihenfolge die auch Daten haben.
Aber um das Groos/Kleinschreibung zu verhindern muss hier noch UPPER rein. das habe ich vergessen.
SQL:
SELECT DISTINCT
    UPPER(LEFT(nachname, 1)) AS letter
FROM
    adressen
ORDER BY
    LEFT(nachname, 1)
 
Zuletzt bearbeitet von einem Moderator:
Hallo,
das habe ich jetzt so umgesetzt und es klappt, vielen Dank!

Kannst du mir auch sagen, wie ich es hinbekomme, dass alle Buchstaben gelistet werden, aber nur die, für die es auch Einträge in der Datenbank gibt, als Link gelistet werden?
 
EDIT: Was sagen die Experten dazu? :)

Ich habe um Testen und zur Vereinfachung mal eine Spalte (initiale) mit den Anfangsbuchstaben angelegt.

PHP:
$alphabet = range('A', 'Z');
$namen = array();
$select = query_function("SELECT DISTINCT LEFT(initiale, 1) AS letter FROM adressen ORDER BY LEFT(initiale, 1)");

	while ($dataset = mysql_fetch_assoc($select)) {
$namen[] = $dataset['letter'];	
	}
	

for ($i=0; $i < count($alphabet); $i++) {

	if (in_array("$alphabet[$i]", $namen, true)) {
 		echo $alphabet[$i] . ' --- link<br>';
	} else {
		echo $alphabet[$i] . ' --- kein link<br>';
	}
}
 
Zuletzt bearbeitet:
Zurück