Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen (A bis Z)

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, 3381 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 ..
Ähnliche Inhalte
Windows Server
gelöst Suche SQL Server 2008 R2 ISO (7)

Frage von miki58 zum Thema Windows Server ...

Administrator.de Feedback
Neuer Bereich Powershell und erweitertes syntax highlighting (6)

Frage von Kraemer zum Thema Administrator.de Feedback ...

Datenbanken
gelöst Fehler 1064 you have an error in SQL syntax datenbankabfrage, Search and Replace (1)

Frage von Blackshirt zum Thema Datenbanken ...

Datenbanken
gelöst SQL-Abfrage mit "kleiner gleich" funktioniert nicht (2)

Frage von derSESO zum Thema Datenbanken ...

Neue Wissensbeiträge
Ubuntu

Ubuntu 17.10 steht zum Download bereit

(3)

Information von Frank zum Thema Ubuntu ...

Datenschutz

Autofahrer-Pranger - Bewertungsportal illegal

(8)

Information von BassFishFox zum Thema Datenschutz ...

Windows 10

Neues Win10 Funktionsupdate verbuggt RemoteApp

(8)

Information von thomasreischer zum Thema Windows 10 ...

Microsoft

Die neuen RSAT-Tools für Win10 1709 sind da

(2)

Information von DerWoWusste zum Thema Microsoft ...

Heiß diskutierte Inhalte
Router & Routing
Allnet - VDSL2 Modem - SFP (mini-GBIC) (20)

Frage von Dobby zum Thema Router & Routing ...

Windows 10
Windows 10 Ordnerfreigabe (19)

Frage von Xaero1982 zum Thema Windows 10 ...

Monitoring
Netzwerk-Monitoring Software (17)

Frage von Ghost108 zum Thema Monitoring ...

Windows Server
gelöst Kopiervorgang schlägt fehl, weil Datei- und Ordnername zu lang sind (14)

Frage von Schroedi zum Thema Windows Server ...