Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

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

Frage Entwicklung Datenbanken

Mitglied: kugman

kugman (Level 1) - Jetzt verbinden

22.12.2009 um 01:39 Uhr, 3345 Aufrufe, 7 Kommentare

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
Mitglied: bakero3010
22.12.2009 um 02:43 Uhr
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...
Bitte warten ..
Mitglied: filippg
22.12.2009 um 04:10 Uhr
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
Bitte warten ..
Mitglied: solaris-ch
22.12.2009 um 07:57 Uhr
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

01.
select 'A' 
02.
union 
03.
select j.username from jump_dev.juser j where j.username like 'a%' 
04.
union select '\r\n' 
05.
union 
06.
 
07.
select 'B' 
08.
union 
09.
select j.username from jump_dev.juser j where j.username like 'b%' 
10.
union select ' \r\n' 
11.
union 
12.
 
13.
select 'C' 
14.
union 
15.
select j.username from jump_dev.juser j where j.username like 'c%' 
16.
union select '  \r\n' 
17.
union 
18.
 
19.
select 'D' 
20.
union 
21.
select j.username from jump_dev.juser j where j.username like 'd%' 
22.
union select '   \r\n' 
23.
union 
24.
 
25.
select 'E' 
26.
union 
27.
select j.username from jump_dev.juser j where j.username like 'e%' 
28.
union select '    \r\n' 
29.
union 
30.
 
31.
select 'F' 
32.
union 
33.
select j.username from jump_dev.juser j where j.username like 'f%' 
34.
union select '     \r\n' 
35.
union 
36.
 
37.
select 'G' 
38.
union 
39.
select j.username from jump_dev.juser j where j.username like 'g%' 
40.
union select '      \r\n' 
41.
union 
42.
 
43.
select 'H' 
44.
union 
45.
select j.username from jump_dev.juser j where j.username like 'h%' 
46.
union select '       \r\n' 
47.
union 
48.
 
49.
select 'I' 
50.
union 
51.
select j.username from jump_dev.juser j where j.username like 'i%' 
52.
union select '        \r\n' 
53.
union 
54.
 
55.
select 'J' 
56.
union 
57.
select j.username from jump_dev.juser j where j.username like 'j%' 
58.
union select '         \r\n' 
59.
union 
60.
 
61.
select 'K' 
62.
union 
63.
select j.username from jump_dev.juser j where j.username like 'k%' 
64.
union select '          \r\n' 
65.
union 
66.
 
67.
select 'L' 
68.
union 
69.
select j.username from jump_dev.juser j where j.username like 'l%' 
70.
union select '           \r\n' 
71.
union 
72.
 
73.
select 'M' 
74.
union 
75.
select j.username from jump_dev.juser j where j.username like 'm%' 
76.
union select '            \r\n' 
77.
union 
78.
 
79.
select 'N' 
80.
union 
81.
select j.username from jump_dev.juser j where j.username like 'n%' 
82.
union select '             \r\n' 
83.
union 
84.
 
85.
select 'O' 
86.
union 
87.
select j.username from jump_dev.juser j where j.username like 'o%' 
88.
union select '              \r\n'
Bitte warten ..
Mitglied: maretz
22.12.2009 um 09:45 Uhr
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)
Bitte warten ..
Mitglied: Biber
22.12.2009 um 19:56 Uhr
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:

01.
SELECT x.Displine 
02.
FROM ( 
03.
SELECT Vorname &  ' - ' & GebDatum as DispLine, 
04.
Asc( Left(Nachname,1))*10000 + Kugmans.FamId*1000 + Kugmans.LfdNr*2 AS Sortorder 
05.
FROM Kugmans 
06.
UNION 
07.
SELECt DISTINCT left(nachname,1),  Asc( Left(Nachname,1))*10000  
08.
 from kugmans 
09.
UNION 
10.
SELECT "--Leerzeile vor Letter--",  Asc( Left(Nachname,1))*10000 -1 
11.
 FROM kugmans 
12.
UNION 
13.
Select Distinct nachname,  Asc( Left(Nachname,1))*10000 +[FamId]*1000  
14.
 from kugmans 
15.
UNION 
16.
SELECT "--Leerzeile vor Fam-- ",  Asc( Left(Nachname,1))*10000 +FamID*1000-1  
17.
 FROM kugmans 
18.
) AS x 
19.
ORDER BY Sortorder;
...und würde folgenden Output als ResultSet liefern
Displine 
--Leerzeile vor Letter-- 
--Leerzeile vor Fam--  
Biber 
Frank - 01.04.99 
--Leerzeile vor Letter-- 
--Leerzeile vor Fam--  
Mustermann 
Max - 01.12.60 
Frieda - 02.03.65 
Pubert - 04.05.77 
--Leerzeile vor Letter-- 
--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

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
Bitte warten ..
Mitglied: solaris-ch
22.12.2009 um 20:21 Uhr
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...?
Bitte warten ..
Mitglied: kugman
23.12.2009 um 00:43 Uhr
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.
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Microsoft
gelöst DRINGEND: Suche Microsoft SQL SERVER 2008 R2 STANDARD Eval (8)

Frage von Xaero1982 zum Thema Microsoft ...

Datenbanken
gelöst SQL-Abfrage - DISTINCT - letztes Datum (3)

Frage von emeriks zum Thema Datenbanken ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (14)

Frage von liquidbase zum Thema Windows Update ...