Mein aktuelles Anliegen ist (für mich) etwas zu komplex. Die Suchfunktion habe ich zwar benutzt. Da ich aber nicht genau weiss, wonach ich suchen soll, habe ich möglicherweise ähnliche Problemstellungen übersehen und bitte schon jetzt um Entschuldigung...
Unser Verein bewirtschaftet die Mitglieder mit Admidio. (Die Datenbank ist also gegeben und kann vom mir nicht beeinflusst werden.) In der Datenbank gibt es verschiedene Tabellen. In der Tabelle adm_members werden in den Spalten mem_begin und mem_end die Start und Enddaten der Rollen (mem_rol_id) der Mitglieder (mem_usr_id) gespeichert. Damit ich nun die Jubiläen richtig berechnen kann, muss ich alle Einträge (eine bis mehrere Zeilen) von zwei Rollen (2 und 73) filtern. Die Knacknuss dabei ist, dass ein (1) Enddatum der Rolle 2 '9999-12-31' enthalten muss. (Dies bedeutet, dass die Person aktuell noch Mitglied des Vereins ist.) Es kann aber auch sein, dass die Person früher bereits Mitglied war und nach einem Unterbruch wieder im Verein mitmacht. Diese früheren Jahre sollen für das Jubiläum auch beigezogen werden. In einer weiteren Tabelle (adm_ user_data) sind dann die Namen und Vornamen in der Spalte usd_value abgelegt. In der Spalte usd_usf_if steht der "Code" für den Wert (1 für Nachname und 2 für Vorname).
Ich habe bereits ein paar Codes ausprobiert. Es werden mir aber stets alle Personen angezeigt, welche jemals im Verein waren....
Mit diesem Code werden die nächsten Jubiläen angezeigt. Leider auch von Ehemaligen.
Wenn ich den unteren Teil (nach EXCEPT) alleine "starte", werden nur die Aktivmitglieder angezeigt.
Hier noch die Tabellen:
adm_members
adm_usr_data
Gewünschtes Resultat:
Kann mir jemand von Euch einen Tipp geben, was ich übersehen habe? Besten Dank und liebe Grüsse aus der verschneiten Schweiz.
voumi
Unser Verein bewirtschaftet die Mitglieder mit Admidio. (Die Datenbank ist also gegeben und kann vom mir nicht beeinflusst werden.) In der Datenbank gibt es verschiedene Tabellen. In der Tabelle adm_members werden in den Spalten mem_begin und mem_end die Start und Enddaten der Rollen (mem_rol_id) der Mitglieder (mem_usr_id) gespeichert. Damit ich nun die Jubiläen richtig berechnen kann, muss ich alle Einträge (eine bis mehrere Zeilen) von zwei Rollen (2 und 73) filtern. Die Knacknuss dabei ist, dass ein (1) Enddatum der Rolle 2 '9999-12-31' enthalten muss. (Dies bedeutet, dass die Person aktuell noch Mitglied des Vereins ist.) Es kann aber auch sein, dass die Person früher bereits Mitglied war und nach einem Unterbruch wieder im Verein mitmacht. Diese früheren Jahre sollen für das Jubiläum auch beigezogen werden. In einer weiteren Tabelle (adm_ user_data) sind dann die Namen und Vornamen in der Spalte usd_value abgelegt. In der Spalte usd_usf_if steht der "Code" für den Wert (1 für Nachname und 2 für Vorname).
Ich habe bereits ein paar Codes ausprobiert. Es werden mir aber stets alle Personen angezeigt, welche jemals im Verein waren....
Mit diesem Code werden die nächsten Jubiläen angezeigt. Leider auch von Ehemaligen.
SQL:
SELECT
usr_id, mem_usr_id, CONCAT(id1.usd_value, ' ',id2.usd_value) AS sort, SUM(If (mem_end = "9999-12-31",YEAR(NOW())-YEAR(mem_begin)+1,YEAR(mem_end) - YEAR(mem_begin)+1)) AS Mitgliedsjahre,
CONCAT
(
IF(30 - SUM(If (mem_end = "9999-12-31",YEAR(NOW())-YEAR(mem_begin)+1,YEAR(mem_end) - YEAR(mem_begin)+1)) + YEAR(NOW())>= YEAR(NOW()),CONCAT(30 - SUM(If (mem_end = "9999-12-31",YEAR(NOW())-YEAR(mem_begin)+1,YEAR(mem_end) - YEAR(mem_begin)+1)) + YEAR(NOW()) , " Kantonaler Veteran, "),""),
IF(35 - SUM(If (mem_end = "9999-12-31",YEAR(NOW())-YEAR(mem_begin)+1,YEAR(mem_end) - YEAR(mem_begin)+1)) + YEAR(NOW())>= YEAR(NOW()),CONCAT(35 - SUM(If (mem_end = "9999-12-31",YEAR(NOW())-YEAR(mem_begin)+1,YEAR(mem_end) - YEAR(mem_begin)+1)) + YEAR(NOW()) , " Eidgenössischer Veteran, "),""),
IF(50 - SUM(If (mem_end = "9999-12-31",YEAR(NOW())-YEAR(mem_begin)+1,YEAR(mem_end) - YEAR(mem_begin)+1)) + YEAR(NOW())>= YEAR(NOW()),CONCAT(50 - SUM(If (mem_end = "9999-12-31",YEAR(NOW())-YEAR(mem_begin)+1,YEAR(mem_end) - YEAR(mem_begin)+1)) + YEAR(NOW()) , " Kantonaler Ehrenveteran, "),""),
IF(60 - SUM(If (mem_end = "9999-12-31",YEAR(NOW())-YEAR(mem_begin)+1,YEAR(mem_end) - YEAR(mem_begin)+1)) + YEAR(NOW())>= YEAR(NOW()),CONCAT(60 - SUM(If (mem_end = "9999-12-31",YEAR(NOW())-YEAR(mem_begin)+1,YEAR(mem_end) - YEAR(mem_begin)+1)) + YEAR(NOW()) , " CISM, "),""),
IF(70 - SUM(If (mem_end = "9999-12-31",YEAR(NOW())-YEAR(mem_begin)+1,YEAR(mem_end) - YEAR(mem_begin)+1)) + YEAR(NOW())>= YEAR(NOW()),CONCAT(70 - SUM(If (mem_end = "9999-12-31",YEAR(NOW())-YEAR(mem_begin)+1,YEAR(mem_end) - YEAR(mem_begin)+1)) + YEAR(NOW()) , " Eidgenössischer Ehrenveteran"),"")
) AS JUBI
FROM
adm_members, adm_users
LEFT JOIN adm_user_data id1 ON id1.usd_usr_id = usr_id
AND id1.usd_usf_id = 1
LEFT JOIN adm_user_data id2 ON id2.usd_usr_id = usr_id
AND id2.usd_usf_id = 2
WHERE
(mem_rol_id = 2 OR mem_rol_id = 73) and mem_usr_id = usr_id
GROUP BY usr_id
EXCEPT
(SELECT usr_id,
CONCAT(id1.usd_value, ' ', id2.usd_value) AS name, CONCAT(id4.usd_value, ' ', id5.usd_value) AS ort, YEAR(mem_begin), YEAR(mem_end)
FROM adm_roles, adm_categories, adm_members, adm_users
LEFT JOIN adm_user_data id1 ON id1.usd_usr_id = usr_id
AND id1.usd_usf_id = 1
LEFT JOIN adm_user_data id2 ON id2.usd_usr_id = usr_id
AND id2.usd_usf_id = 2
LEFT JOIN adm_user_data id4 ON id4.usd_usr_id = usr_id
AND id4.usd_usf_id = 4
LEFT JOIN adm_user_data id5 ON id5.usd_usr_id = usr_id
AND id5.usd_usf_id = 5
WHERE rol_id = 2 AND mem_begin <= NOW() AND mem_end > NOW()
AND rol_valid = 1
AND rol_cat_id = cat_id
AND cat_org_id = 1
AND mem_rol_id = rol_id
AND mem_usr_id = usr_id
AND usr_valid = 1)
ORDER BY JUBI ASC;
Wenn ich den unteren Teil (nach EXCEPT) alleine "starte", werden nur die Aktivmitglieder angezeigt.
Hier noch die Tabellen:
adm_members
mem_id | mem_usr_id | mem_rol_id | mem_begin | mem_end |
1 | 940 | 2 | 1970 | 1975 |
2 | 940 | 2 | 1980 | 1991 |
3 | 940 | 2 | 2001 | 9999 |
4 | 940 | 73 | 1960 | 1965 |
5 | 920 | 73 | 1975 | 1990 |
6 | 920 | 2 | 1991 | 9999 |
7 | 910 | 2 | 1990 | 2000 |
8 | 900 | 2 | 1990 | 2000 |
9 | 900 | 2 | 2020 | 9999 |
10 | 800 | 2 | 1990 | 1991 |
adm_usr_data
usd_id | usd_usr_id | usd_usr_id | usd_value |
1 | 940 | 1 | Nachname 1 |
2 | 940 | 2 | Vorname 1 |
3 | 920 | 1 | Nachname 2 |
4 | 920 | 2 | Vorname 2 |
5 | 910 | 1 | Nachname 3 |
6 | 910 | 2 | Vorname 3 |
7 | 900 | 1 | Nachname 4 |
8 | 900 | 2 | Vorname 4 |
9 | 800 | 1 | Nachname 5 |
10 | 800 | 2 | Vorname 5 |
Gewünschtes Resultat:
mem_usr_id | Vorname | Nachname | Jahre | JUBI |
940 | Vorname 1 | Nachname 1 | 48 | 2026 Vet... |
920 | Vorname 2 | Nachname 2 | 50 | 2024 Vet... |
900 | Vorname 4 | Nachname 4 | 16 | 2038 Vet... |
Kann mir jemand von Euch einen Tipp geben, was ich übersehen habe? Besten Dank und liebe Grüsse aus der verschneiten Schweiz.
voumi