Antworten auf deine Fragen:
Neues Thema erstellen

mySQL-Abfrage

Phips_CH

Noch nicht viel geschrieben

Hallo zusammen

Bei meiner Homepage für einen Verein möchte ich eine Abfrage machen, die mir die Person anzeigt, die aktuell im Vorstand tätig ist.

Ich schreibe für eine Änderung im Vorstand immer einen neuen Datensatz. Das heisst, wenn jemand ein Amt antritt und auch wenn er wieder davon zurücktritt.

Das gibt mir einen Datensatz. Mit der ID aus der Tabelle Namen, der ID des Amtes (Präsident, Kassier, Aktuar, etc) und der Spalte, Dann ob er es angetreten hat (1) oder zurückgetreten ist (2) in der letzten Spalte steht noch die ID der Tabelle wo die Datum der Jahresversammlung, wann die Antritte resp. die Rücktritte stattfinden.

Wenn ich nun mal den aktuellen Präsidenten abfragen möcht,
hab ich mehre Person die das Amt mal angetreten haben. und alle bis auf einen sind davon wieder zurückgetreten. und diesen Datensatz möchte ich abfragen.

Leider hab ich im Netz darüber nichts gefunden. ich hoffe ihr könnt mir da weiterhelfen.

Grüsse aus der Schweiz
Phips_CH
 

limubai81

Nicht mehr ganz neu hier

AW: mySQL-Abfrage

Hi Phips_CH,

habe zwar lange nichts mehr in mySQL gemacht aber es müsste doch reichen dir die letzte id ausgeben zu lassen.
Code:
SELECT id FROM tabelle ORDER BY id DESC LIMIT 1
Mit id ist die Spalte mit AUTO_INCREMENT gemeint.

Dürfte glaube ich ausreichen so.

lg LiMu


edit: achja die ID des Amtes musste in der Abfrage dann auch mit einbauen.
 

Phips_CH

Noch nicht viel geschrieben

AW: mySQL-Abfrage

Hallo LiMu
Vielen Dank für die rasche Antwort.
Das wäre eine Möglichkeit. Aber wenn ich später die Liste ergänzen werde und jemanden erfasse der Mal Präsident oder was auch immer war, dann erhalte ich aber das falsche Ergebniss.

Gibt es keine Möglichkeit den Datensatz abzufragen, zu dem es mit der selben ID der Amtes und der Person keinen Datensatz gibt wo bei angetreten keiner existiert mit dem Eintrag "2"?

Ich möchte die Tabelle auch als History verwenden.

Ja das hab wohl vergessen zu erwähnen. ;)
 

afr0kalypse

Allwissendes Karmameerschweinchen!

AW: mySQL-Abfrage

kann in deiner tabelle auch jemand mehrmals präsident gewesen sein? wenn nicht, zählst du wie oft eine person mit einem bestimmten amt in deiner tabelle vorkommt. derjenige, der nur einmal vorkommt muss wohl noch amtieren. alle anderen kommen zweimal vor. einmal für eintritt und einmal für austritt.

wenn du die tabelle, die du da nutzt, bearbeiten kannst, dann trenne die spalte für ein und austritt mal in 2 spalten auf und setz nen flag. dann könntest du abfragen nach eingetreten = ja und ausgetreten = nein
 

limubai81

Nicht mehr ganz neu hier

AW: mySQL-Abfrage

Oh dann bin ich leider überfragt aber ich glaube dir kann am besten geholfen werden wenn du mal den Aufbau der besagten 3 Tabellen postest.
Vielleicht kann man ja eine Abfrage erstellen welche die Daten aller Tabellen einbezieht so lang diese auch untereinander zugeordnet werden können.
 

afr0kalypse

Allwissendes Karmameerschweinchen!

AW: mySQL-Abfrage

ja die tabellen wären interessant. und es wäre auch interessant zu wissen, inwiefern du die bearbeiten kannst. die struktur klingt nämlich irgendwie nicht ganz so sinnig. vielleicht kann man da was verbessern.
 
D

DF9AL

Guest

AW: mySQL-Abfrage

Hallo Phips_CH,

...und der Spalte, Dann ob er es angetreten hat (1) oder zurückgetreten ist (2)...

Such doch mal nach WHERE in Verbindung mit MySQL, da gibt es 100te von Seiten mit Beispielen.
Dieses mit "Spalte" = 1 und den Werten der Spalte mit den Kürzeln des Vorstandes zusätzlich in der Abfrage sollte doch den aktiven Vorstand raussuchen. Ansonsten währe der Tabellenaufbau interessant.

Gruß Andreas
 
D

DF9AL

Guest

AW: mySQL-Abfrage

Nochmal, sorry.
Man muß halt richtig lesen, mehrere Tabellen.:rolleyes:

Da sind dann wohl auch die JOIN gute Kandidaten für eine Suche...
 

hub

nicht ganz neu hier

AW: mySQL-Abfrage

Moin,
um dir bei diesem Problem konkret zu helfen, müsste man die Struktur deiner Datenbank incl. der Tabelle gefüllt mit Beispieldaten kennen (vlt. einen Dump, wenns kein Geheimnis ist?). Irgendwie scheint der Entwurf nicht sehr gelungen, wenn du dich so verrenken musst.

Gruß Ulli
 

Phips_CH

Noch nicht viel geschrieben

AW: mySQL-Abfrage

Ja theoretisch ist das ganz guät möglich.
was meinst du mit flag.?

Ich kann die Tabellen bearbeiten

Ich hab Tabellen:
Namen
Amt
Datum
Amt_Name


In Der Tabelle Amt_Name sieht so aus:
ID ID_Name ID_Amt ID_Datum an-/zurückgetreten
1 1 1 1 1
2 2 2 1 1
3 1 1 4 2
4 3 1 4 1
5 2 2 5 2
6 1 3 6 1
7 2 2 5 1

Das heisst:
ID 1, Person 1 ist das Amt 1 am Datum 1 angetreten (1)
ID 2, Person 2 ist das Amt 2 am Datum 1 angetreten (1)
ID 3, Person 1 ist vom Amt 1 am Datum 4 zurückgetreten (2)
ID 4, Person 3 ist das Amt 1 am Datum 4 angetreten (1)
ID 5, Person 2 ist vom Amt 2 am Datum 5 zurückgetreten (2)
ID 6, Person 1 ist das Amt 3 am Datum 6 angetreten (1)
ID 7, Person 2 ist das Amt 2 am Datum 5 angetreten (1)

So ist aktuell:
Person 3 im Amt 1, Person 4 im Amt 2 und Person 1 im Amt 3

Sorry die Darstellung

Gruss
Phips_CH
 

Duddle

Posting-Frequenz: 14µHz

AW: mySQL-Abfrage

Hmmm, das ID_Datum gefällt mir nicht. Kannst du garantieren, dass die Daten dahinter streng geordnet sind, d.h. wenn eine Zahl in ID_Datum kleiner als eine andere Zahl ist auch das Datum der ersten Zahl vor dem Datum der zweiten Zahl liegt?

Edit: dein Beispiel hat einen Tippfehler? Person 4 kommt nie vor. Meinst du dort Person 2? Die Datensätze 5 und 7 sind am gleichen Datum, wobei zurück- und antreten gleichzeitig passiert sind. Was gilt dann? Der Datensatz mit der höheren ID?


Duddle
 
Zuletzt bearbeitet:

hub

nicht ganz neu hier

AW: mySQL-Abfrage

Moin,
in dieser Konstellation scheint mir das ein unsicheres Unterfangen zu sein, siehe Duddles Anmerkung.
So, wie afr0kalypse schon schrieb, würde auch ich die Struktur der Datenbank / Tabellen überdenken und ändern- vorausgesetzt, du hast die Möglichkeit, sie zu ändern.
Wie schon geschrieben, ein Dump könnte eventuell mehr Klarheit verschaffen.

Gruß Ulli
 

afr0kalypse

Allwissendes Karmameerschweinchen!

AW: mySQL-Abfrage

ich würde aus den 4 tabellen 3 machen.
tbl_person: id_person, vorname, nachname, sonstwas
tbl_amt: id_amt, amtname
tbl_personen_amt: id_person, id_amt, eintrittsdatum, austrittsdatum
in der tabelle personen_amt sind alle felder pflichtfelder außer austrittsdatum. so lange das austrittsdatum null ist, ist die person im amt.
so würde ich es machen.
 

Duddle

Posting-Frequenz: 14µHz

AW: mySQL-Abfrage

Noch ein paar Fragen: kann es vorkommen, dass ein Amt unbesetzt ist? In deinem Beispiel korreliert jeder Rücktritt mit einem Antritt.

Falls ein Amt nie unbesetzt sein kann, sollte es ausreichen wenn du lediglich den Neusten aller Antritte eines Amtes holst, also
Code:
SELECT *
FROM tab
WHERE id_amt = 1
AND status = 1
order by id_datum desc
LIMIT 1
Hier gehe ich davon aus, dass id_datum wie ein Datum behandelt wird. Ansonsten holst du das per JOIN rein und sortierst nach dem echten Datum. Die Spalte status ist bei mir das An-/Rücktreten.
Aber wie gesagt, das nur unter der Annahme dass ein Amt nie unbesetzt ist.


Duddle
 

rafoldi

Aktives Mitglied

AW: mySQL-Abfrage

Also damit das Ordentlich funktioniert solltest Du ein Datum von und bis führen das macht es etwas einfacher. Es kann ja auch jemand vorher abtreten. Dann könntest Du mit row_number und Partition over einen Rand einfügen.
Natürlich Interessiert Dich nur Rang 1.
Die ID's finde ich Ok, Dupletten sind nicht OK.
 

Phips_CH

Noch nicht viel geschrieben

AW: mySQL-Abfrage

Hallo zusammen

@Duddle
Genau es gibt einen Tippfehler. in der ID müsste bei ID_Name eine 4 stehen. Es kann gut sein das zwei Ämter am selben Datum ändern. Ein Person von von einem Amt zurücktreten und am selben Datum ein anderes Antreten. eine sogenannte rochade im Vorstand. Es kann auch sein das die Reihenfolde der Datensätze nicht der des Datums entspricht.

@hub
Ja ich kann die Struktur anpassen. Der Tipfehler ist beim erstellen des Beispiels passiert.
Was meist du mit Dump?

@afr0kalypse
das würde aber bedeuten, wenn jemand von einem Amt zurücktritt, ich einen bestehenden Datensatz updaten müsste. Meine Überlegung war es, das ich bei einer Änderung im Vorstand mittels eines PHP-Formular immer einen neuen Datensatz erzeuge, um es für den Anwender möglichst einfach.

@Duddle
ja es kann gut sein, dass ein Amt nicht besetzt ist.

@rafoldi
hinter den ID_Datum steht ein Datum. Jenes der Hauptversammlung.
Da müsste ich auch zuerst den Datensatz aktualisieren und dann denn bei einem neuantritt, ein Datensatz hinzufügen.

Gruss
Philips_CH
 

Duddle

Posting-Frequenz: 14µHz

AW: mySQL-Abfrage

ja es kann gut sein, dass ein Amt nicht besetzt ist.
Und was soll die Anfrage dann zurückgeben? Den letzten Amtsinhaber oder ein leeres Ergebnis?

Weiterhin nochmal: was bedeutet es, wenn am gleichen Tag jemand ein- und austritt? Für mich gibt es da zwei Interpretationen: entweder ist er aus- und wieder eingetreten, oder er ist ein- und wieder ausgetreten. Letzteres macht zwar für mich keinen Sinn, aber vielleicht muss das manchmal für irgendwelche internen Regularien passieren.

Sind hinter den id_datum-Einträgen echte Datumsangaben verborgen? Beziehungsweise, wie würdest du die Einträge eindeutig chronologisch sortieren?


Duddle
 

Phips_CH

Noch nicht viel geschrieben

AW: mySQL-Abfrage

Es kann sein das beim Verein für ein Jahr das Amt des Vicepräsidenten oder Beisitzer Vakant ist, da keiner gefunden werden konnte. dann bleib die Ausgabe einfach leer.

also bevor jemand für ein Amt gewählt werden kann (amtsantritt), muss es zuerst von seinem aktuellen Amt zurücktreten. Aber ob ich in der DB zuerst en antritt oder rücktritt erfasse darf keine Rolle spielen.
Es daf auch in der Tabelle Amr_Name keine Rolle spielen in welcher Reihenfolge die Datensätze stehen.

ja da steht das Datum der Hauptversammlung die einmal im Jahr statt findet, die sind chronologisch hinterlegt, sofern das erfassen immer sauber gemacht wird. ;)

Es kann auch mal sein, dass es eine Ausserordentliche Versamlung geben kann. Dann wären es zwei Datum pro Jahr. Drei könnten es theoretisch auch sein, wäre aber sehr selten der Fall.

Desshalb hab ich mir gedacht, ich mach für jedes Ereigniss einen Datensatz und frage wer hat es angetreten und ist nie zurückgetreten,
dann spielt die Reihenfolge keine Rolle. und wenn das Amt nicht besetzt ist, bleibt die Abfrage leer. Und ich muss nicht unterscheiden, ob jemand zurücktritt (Datensatz aktualisieren) oder neu antritt (Datensatz einfügen)
 

Duddle

Posting-Frequenz: 14µHz

AW: mySQL-Abfrage

Okay, ich habe jetzt wohl einen guten Ansatz gefunden. Meine Struktur für die Tests sah wie folgt aus, nur damit du den Namen folgen kannst:
Code:
CREATE TABLE t (
    id int primary key AUTO_INCREMENT, 
    id_name int,
    id_amt int,
    id_datum int,
    status int
);

INSERT INTO t (id, id_name, id_amt, id_datum, status) 
VALUES 
(1,1,1,1,1),
(2,2,2,1,1),
(3,1,1,4,2),
(4,3,1,4,1),
(5,2,2,5,2),
(6,1,3,6,1),
(7,2,2,5,1);
Erstmal holen wir uns alles und JOINen es so, damit Ein- und Austritte sich gegenüberstehen
Code:
SELECT *
FROM  t t1
JOIN t t2
ON t1.id_name = t2.id_name
AND t1.id_amt = t2.id_amt
AND t1.status != t2.status
AND t1.id_datum < t2.id_datum
Das bringt mir aber nur die Zeilen, deren Ein- auch ein Austritt folgt, ignoriert also die Eintritte ohne Austritt. Macht man aber einen äusseren (im konkreten: LEFT) JOIN draus, werden letztere auch angezeigt, nur eben mit NULL in den Feldern ohne "Gegenspieler".
Code:
SELECT *
FROM  t t1
[B]LEFT[/B] JOIN t t2
ON t1.id_name = t2.id_name
AND t1.id_amt = t2.id_amt
AND t1.status != t2.status
AND t1.id_datum < t2.id_datum
Aber wir wollen ja nur die derzeit besetzten Ämter, also filtern wir diese.
Code:
SELECT *
FROM  t t1
LEFT JOIN t t2
ON t1.id_name = t2.id_name
AND t1.id_amt = t2.id_amt
AND t1.status != t2.status
AND t1.id_datum < t2.id_datum
[B]WHERE t1.status = 1[/B]
Schließlich filtern wir nach den Austritten. Wenn es keinen zu einem Eintritt gibt, ist da NULL.
Code:
SELECT *
FROM  t t1
LEFT JOIN t t2
ON t1.id_name = t2.id_name
AND t1.id_amt = t2.id_amt
AND t1.status != t2.status
AND t1.id_datum < t2.id_datum
WHERE t1.status = 1
[B]AND t2.status is NULL[/B]
Dies gibt dir für alle Ämter den derzeitigen Amtsinhaber. Dort kannst du jetzt noch nach id_amt filtern, um es darauf zu begrenzen.

Aber Achtung: ich habe hier id_datum benutzt. Ich überlasse dir als Aufgabe, die echten Daten per JOIN jeweils in die beiden Tabellen zu holen, bevor du sie vereinst. Vergiss nicht, auch den Vergleich von id_datum beider Tabellen auf die echten Daten anzupassen.


Duddle
 

rafoldi

Aktives Mitglied

AW: mySQL-Abfrage

Hallo Philipp
Das Datum der Hauptversammlung ist schon ok nur ein Datum von / bis macht Sinn wenn ein Mitglied vorzeitig ausscheidet.
Ich habe in fast allen meiner Tabellen / XML Konventionen ein von / bis drin, hat sich immer bewährt.
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Keine Mitglieder online.

Statistik des Forums

Themen
118.635
Beiträge
1.538.449
Mitglieder
67.556
Neuestes Mitglied
Ggirl
Oben