kugman
Goto Top

SQL - auf der Suche nach der korrekten Syntax für ein Mitgliederverzeichnis

Ich würde mich über einen Hinweis zu meiner kleinen Fragestellung sehr freuen.

Ich habe eine Datenbank mit 5 Spalten: Familien-ID, lfd-Nr, Nachname, Vorname, Geburtsdatum

Da sind ca 300 Datensätze drin. Z.Bsp:
01,01,Mustermann,Max,01.12.1960
01,02,Mustermann,Frieda,02.03.1965
01,03,Mustermann,Pubert,04.05.1977
02,01,Panzer,Paul,02.04.1964
02,02,Panzer,Friedegunde,17.11.1966
03,01,Pillemann,Knut,26.11.1969
03,02,Pillemann,Gerda, 18.07.1966

Meine Ausgabe soll so sein:

M

Mustermann
Max - 01.12.1960
Frieda - 02.03.1965
Pubert - 04.05.1977

P

Panzer
Paul - 02.04.1964
Friedegunde - 17.11.1966

Pillemann
Knut - 26.11.1969
Gerda - 18.07.1966


Ich versuch da jetzt schon eine ganze Weile dran, aber ich bekomm es nicht hin. Ich hoffe, dass aus meinem Beispiel klar wird, was ich eigentlich will. Ich habe also verschiedene Familien, die ich jeweils zusammengefasst darstellen möchte (Familien-ID). Der Nachname soll als Überschrift dargestellt werden. Die gesamten Namen sollen jedoch als Index den ersten Buchstaben bekommen...

Kann mir hier bitte jemand weiterhelfen?


vielen Dank schon mal

Markus

Content-ID: 132112

Url: https://administrator.de/forum/sql-auf-der-suche-nach-der-korrekten-syntax-fuer-ein-mitgliederverzeichnis-132112.html

Ausgedruckt am: 22.12.2024 um 19:12 Uhr

bakero3010
bakero3010 22.12.2009 um 02:43:09 Uhr
Goto Top
Mit welcher Sprache willstn das machen? Mit nem reinen Sql-Skript wird das so wohl kaum oder garnicht realisierbar sein denke ich ... ansonsten sind das doch nur ein paar abfragen bzw. schleifen Oo

z.B

select * from tabelle where nachname like 'M%' --> in ein array -->

foreach(array as index => nachname) {
select vorname,geb_dat from tabelle where nachname = nachname

}

usw...

hoffe das war das was du brauchst...
filippg
filippg 22.12.2009 um 04:10:03 Uhr
Goto Top
Hallo,

suchst du ein DB-Design oder ein Abfrage-Code?
Sprechen wir hier von einer akademischen Aufgabe, oder einer praktischen (dann wäre DBMS und Darstellungssprache interessant)?

Beachtest du den Fall, dass Mitglieder einer Familie nicht den gleichen Nachnamen haben müssen? Unter welchem Buchstaben tauchen die dann auf?
Wenn du vereinfachend annimmst, dass alle den gleichen Nachnamen haben: In der Personen-Tabelle Spalte Nachname entfernen, dafür eine Tabelle "Familie" mit Spalten "FamilienID" und "Nachname" erstellen.
Weiterhin solltest du dir die GROUP BY-Funktion in SQL anschauen, ich denke, das ist letztlich das, was du suchst.

Gruß

Filipp
solaris-ch
solaris-ch 22.12.2009 um 07:57:10 Uhr
Goto Top
Oder du machst es ganz einfach mit etwas Fleiss. Weil das Alphabet hat ja nicht mehr als 26 Grundbuchstaben... Somit ist der Aufwand nach meiner Methode relativ gering...

Zu beachten sind die Anzahl Blank-Spaces vor jedem \r\n, welche bei jeder neuen Zeile einen Blank-Space mehr sein muss als bei der Vorhergehenden.

Habe dir mal ein Beispiel gemacht welches den von dir gewünschten Output liefern sollte. Natürlich musst du die Tabellennamen, etc deinen Gegebenheiten anpassen.

Grüsse

select 'A'  
union
select j.username from jump_dev.juser j where j.username like 'a%'  
union select '\r\n'  
union

select 'B'  
union
select j.username from jump_dev.juser j where j.username like 'b%'  
union select ' \r\n'  
union

select 'C'  
union
select j.username from jump_dev.juser j where j.username like 'c%'  
union select '  \r\n'  
union

select 'D'  
union
select j.username from jump_dev.juser j where j.username like 'd%'  
union select '   \r\n'  
union

select 'E'  
union
select j.username from jump_dev.juser j where j.username like 'e%'  
union select '    \r\n'  
union

select 'F'  
union
select j.username from jump_dev.juser j where j.username like 'f%'  
union select '     \r\n'  
union

select 'G'  
union
select j.username from jump_dev.juser j where j.username like 'g%'  
union select '      \r\n'  
union

select 'H'  
union
select j.username from jump_dev.juser j where j.username like 'h%'  
union select '       \r\n'  
union

select 'I'  
union
select j.username from jump_dev.juser j where j.username like 'i%'  
union select '        \r\n'  
union

select 'J'  
union
select j.username from jump_dev.juser j where j.username like 'j%'  
union select '         \r\n'  
union

select 'K'  
union
select j.username from jump_dev.juser j where j.username like 'k%'  
union select '          \r\n'  
union

select 'L'  
union
select j.username from jump_dev.juser j where j.username like 'l%'  
union select '           \r\n'  
union

select 'M'  
union
select j.username from jump_dev.juser j where j.username like 'm%'  
union select '            \r\n'  
union

select 'N'  
union
select j.username from jump_dev.juser j where j.username like 'n%'  
union select '             \r\n'  
union

select 'O'  
union
select j.username from jump_dev.juser j where j.username like 'o%'  
union select '              \r\n'  
maretz
maretz 22.12.2009 um 09:45:44 Uhr
Goto Top
Moin,

naja - wenn schon einzelne Abfragen dann würde ich das mit nem Array lösen...

Erst nen Array mit jedem Buchstaben des Alphabet's bauen - und dann

foreach ($meinArray as $value) {
$query = "select username from ... where username like '$value%'";
}

Ansonsten kann man es natürlich auch machen das man sich alles der Benutzernamen sortiert aus der DB holt und dann immer den ersten Buchstaben mit dem letzten Schleifendurchlauf vergleicht. Unterscheidet sich das Ergebnis
vom letzten durchlauf vom aktuellen Durchlauf dann muss man halt den Buchstaben drüber schreiben der jetzt dran kommt... (hier schreibe ich absichtlich keine Lösung - da es sich m.E. um eine typische Hausaufgabe handelt und
ich doch das Denken nicht komplett abnehmen möchte)
Biber
Biber 22.12.2009 um 19:56:53 Uhr
Goto Top
Moin Kugman,

meiner Ansicht nach ist die Query nur unter Randbedingungen (siehe unten) mit SQL-Mitteln zu lösen.

Zwei elementare Randbedingungen wären:
a) Du verrätst mal, welches Datenbankblech drunterliegt, denn ein Standard-SQL gibt es weder heute noch in 200 Jahren.

b) und du erklärst mal dein Primary-Key-Konzept....
wenn die Eindeutigkeit eine Datensatzes vermutlich durch "FamilienID" +"LfdNr" sichergestellt wird,
die logische Sortierung aber "Nachname" + Lfdnr sein soll, dann ist es nicht sonderlich geschickt.

Zur Verdeutlichung - in deinen Beispieldaten oben geht es ja auf wunderbare Weise auf... die kleinste FamilienID ist auch die alphabetisch "erste" usw.

Wie würde dir die Mimik laufen, wenn du irgendwann in deinen Mitgliederdaten eine NEUE FamilienId anlegen musst (z.B die FamID 99, weil halt schon 98 Fam-Ids vergeben sind, und der Nachname aber mit "A" anfängt? Oder wenn du zwei Familien-IDs 47 und 11 hast und der Nachname jeweils "Müller" ist ?

Anyhow, eine etwas kürzere Union-Variante sähe in Access-Syntax so aus:

SELECT x.Displine
FROM (
SELECT Vorname &  ' - ' & GebDatum as DispLine,  
Asc( Left(Nachname,1))*10000 + Kugmans.FamId*1000 + Kugmans.LfdNr*2 AS Sortorder
FROM Kugmans
UNION
SELECt DISTINCT left(nachname,1),  Asc( Left(Nachname,1))*10000 
 from kugmans
UNION
SELECT "--Leerzeile vor Letter--",  Asc( Left(Nachname,1))*10000 -1  
 FROM kugmans
UNION
Select Distinct nachname,  Asc( Left(Nachname,1))*10000 +[FamId]*1000 
 from kugmans
UNION
SELECT "--Leerzeile vor Fam-- ",  Asc( Left(Nachname,1))*10000 +FamID*1000-1   
 FROM kugmans
) AS x
ORDER BY Sortorder;

...und würde folgenden Output als ResultSet liefern
Displine
--Leerzeile vor Letter--
B
--Leerzeile vor Fam-- 
Biber
Frank - 01.04.99
--Leerzeile vor Letter--
M
--Leerzeile vor Fam-- 
Mustermann
Max - 01.12.60
Frieda - 02.03.65
Pubert - 04.05.77
--Leerzeile vor Letter--
P
--Leerzeile vor Fam-- 
Panzer
Paul - 02.04.65
Friedgunde - 17.11.66
--Leerzeile vor Fam-- 
Pillemann
Knut - 26.11.69
Gerda - 18.07.66
 

Die Tabelle heißt bei mir "Kugmans",
die jeweiligen Leerzeilen habe ich hier beim proof-of-concept durch Debug-Text ersetzt,
ebenfalls ergänzt als POC habe ich einen neuen Datensatz mit den Werten FamId 4, LfdNr 1, "Biber", Vorname, Datum.
Eine weitere denkbare Leerzeile wäre z.B mit " UNION SELECT "--Leerzeile nach Fam-- ", Asc( Left(Nachname,1))*10000 +FamID*1000-+1" machbar face-wink

ABER: Die Reihenfolge ("sortorder" in der Query) hängt dennoch nur vom Anfangsbuchstaben des Nachnamens + FamId + LfdNr ab, nicht vom Nachnamen selbst.

Grüße
Biber
solaris-ch
solaris-ch 22.12.2009 um 20:21:37 Uhr
Goto Top
Mich würde mal ganz nebenbei interessieren für welche Variante er sich entschieden hat, oder ob er vielleicht das ganze doch mit PHP oder ähnlich lösen will...?
kugman
kugman 23.12.2009 um 00:43:23 Uhr
Goto Top
Hallo zusammen,

sorry, dass ich mich jetzt erst melde. Der Grund dafür ist Zeit, Zeit, Zeit...

wofür ich das eigentlich brauche ist relativ einfach zu sagen. Ich bau gerade eine Vereinswebseite mit etwas mehr als 300 Mitgliedern. Die Seite mach ich mit Joomla 1.5 und dem CommunityBuilder 1.2.1 Allerdings ist die darin enthaltene Listen-Generierung dermaßen eingeschränkt, dass ich damit halt nicht wirklich ein übersichtliches Mitgliederverzeichnis hinbekomme. Erweiterungen für den CommunityBuilder habe ich diesbezüglich nicht gefunden.