Select WHERE - Komplexe Abfragen und Kombinationen nicht händisch anpassen müssen

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Ennstaler
**
Beiträge: 39
Registriert: Mi, 12.04.2017 07:31

Select WHERE - Komplexe Abfragen und Kombinationen nicht händisch anpassen müssen

Beitrag von Ennstaler » Fr, 05.05.2017 07:25

Guten Morgen an das Forum;

Ich habe in meiner Bogenturnier Auswertung (MariaDB) viele verschiedene Abfragemöglichkeiten, die aber von Turnier zu Turnier in unserem Verein unterschiedlich sein können.

Zum Beispiel bei der derzeitigen Bogenturnier Auswertung habe ich jetzt schon über 30 Abfragen, da es so viele Kombinationen aus Bogenklasse, Alter, Geschlecht usw gibt. Derweil hab ich nur 4 Bogenklassen, es gibt ja noch weit mehr.

Da steigt die Anzahl der Abfragen ins Uferlose.

Dank eurer Hilfe im Thread viewtopic.php?f=8&t=68140 bin ich schon sehr weit punkto Komfort bei der Admin-Verwaltung der Turnierauswertung.

Hier ein Beispiel:

Code: Alles auswählen

SELECT (SELECT COUNT( `punkte` ) FROM `teilnehmer` 
WHERE `punkte` > `a`.`punkte` 
AND `alter` >= (SELECT `alter_min` FROM `altersklassen` WHERE `zeile` = 'Jugend')
AND `alter` <= (SELECT `alter_max` FROM `altersklassen` WHERE `zeile` = 'Jugend') ) + 1 AS `rang`, 
`nachname`, `vorname`, `wohnort`, `geschlecht`, `alter`, `bogen`, `punkte`, `kills`, `verein` FROM `teilnehmer` AS `a` 

WHERE `punkte`
 
AND `alter` >= (SELECT `alter_min` FROM `altersklassen` WHERE `zeile` = 'Jugend')
AND `alter` <= (SELECT `alter_max` FROM `altersklassen` WHERE `zeile` = 'Jugend')

ORDER BY `punkte` DESC, `kills` DESC"

In dieser Beispielsabfrage werden alle Jugendliche zwischen 11 und 15 Jahre nach Rang der erreichten Punkte (bei Punktegleichstand zusätzlich
noch nach erreichten Kills) ausgewertet.

Die Bogenklasse und Geschlecht ist in diesem Beispiel nicht berücksichtig, sonst wird mein Anliegen noch komplizierter zum formulieren.
Vermutlich kann diese Abfrage auch eleganter geschrieben werden, aber dafür reichen meine Kenntnisse einfach noch nicht aus.

Funktioniert alles tadellos - auch das Eintragen der Werte (hier 11 und 15) über ein Formular.


Ich habe in der Tabelle "altersklassen" die Spalten "zeile", "alter_min" und "alter_max" angelegt. Derzeit sind 4 Einträge enthalten:

1) Erwachsene in Spalte "zeile", 16 in Spalte "alter_min" und 99 in Spalte "alter_max";
2) Jugendlich in Spalte "zeile", 11 in Spalte "alter_min" und 15 in Spalte "alter_max";
3) Kinder in Spalte "zeile", 0 in Spalte "alter_min" und 10 in Spalte "alter_max";
4) Senioren in Spalte "zeile", 60 in Spalte "alter_min" und 99 in Spalte "alter_max";


Nur ist es meistens so, dass es bei nächsten Vereineturnier noch zuätzliche Altersklassen gibt, zum Beispiel "Jugend_I" (Alter von 12-14) und "Jugend_II" (Alter 15-16).

Ich kann diese zusätzlichen Altersklassen (übrigens das gleiche gilt auch für Bogenklassen) über ein Formular eintragen, editieren, ändern und löschen. Alles kein Problem und funktioniert auch tadellos.

Mein Problem ist, WIE schaffe ich es, dass in diesem Beispiel das
Jugend in dem Teil der Abfrage "...WHERE `zeile` = 'Jugend')..." sich in
"Jugend_II" ändert, wenn in der Tabelle
"altersklassen" der Eintrag
"Jugend_II" in der Spalte
"zeile" über das Formular angelegt wurde.

Pffff... ich hoffe, ich habe mich halbwegs verständlich ausgedrückt, ich weiß nicht, ob das überhaupt möglich ist.
Ein Such-Filterformular löst auch nicht das Problem der automatischen Änderung des Suchmodus (in meinem Beipsiel von "Jugend" auf "Jugend_II").

Das Gleiche wäre auch für zusätzliche Bogenklassen anzuwenden. Es gibt ja sehr viele Bogenklassen (die wiederum noch in Unterklassen unterteil werden).

Ihr seht, ich müsste da ein paar 100 Abfrage vorbereiten, um so sämtliche Kombinationen abzudecken.

Das muss doch einfacher zu machen sein, damit ich nicht bei jedem Vereinturnier die Abfragen händisch anpassen muss. Mir fehlt irgendwie der Grundgedanke dazu - einzige was mir einfällt - das mittels Checkboxen oder Auswahlmenü die Werte aus der Datenbank in einen Platzhalter der Anfrage zu schreiben, oder so ähnlich.

Beste Grüße,
Peter

RobertG
*******
Beiträge: 1638
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Select WHERE - Komplexe Abfragen und Kombinationen nicht händisch anpassen müssen

Beitrag von RobertG » Fr, 05.05.2017 15:53

Hallo Peter,

Du müsstest Dich in den Unterabfragen nicht auf den Namen der Altersklasse beziehen, die ergibt sich doch aus dem Alter:

Code: Alles auswählen

(SELECT `zeile` FROM `altersklassen` WHERE `a`.`alter` BETWEEN `alter_min` AND `alter_max`) AS `Altersklasse`
Das würde Dir die Altersklasse ermitteln.

Entsprechend bearbeitest Du in einer Abfrage nicht nur eine Altersklasse sondern alle Altersklassen gleichzeitig.

Schau Dir dazu einmal im Handbuch ein bisschen die korrelierende Unterabfrage an.

Gruß

Robert

Ennstaler
**
Beiträge: 39
Registriert: Mi, 12.04.2017 07:31

Re: Select WHERE - Komplexe Abfragen und Kombinationen nicht händisch anpassen müssen

Beitrag von Ennstaler » Fr, 05.05.2017 16:00

Danke Robert, da kann ich mich gut weiterbilden, mir fehlen einfach oft die richtigen Begriffe dafür, wonach ich recherieren muss. Danke.

Ennstaler
**
Beiträge: 39
Registriert: Mi, 12.04.2017 07:31

Re: Select WHERE - Komplexe Abfragen und Kombinationen nicht händisch anpassen müssen

Beitrag von Ennstaler » Fr, 05.05.2017 17:13

Hallo Robert;

Ich hab mir das jetzt nochmals angeschaut.

Ich glaub, das ist mir jetzt zu hoch, denn wie soll "zeile" ohne ="Jugend" wissen, welche der 4 Beispielaltersklassen zu laden ist?
Und es würde auch nicht mein eigentliches Problem lösen, das man "Senioren", "Erwachsene" usw.. auswählen kann und man dadurch die Anzahl der angelegten Abfragen reduziert.

Denn bei jedem Turnier können andere Bogenklassen und andere Altersklassen sein. Deshalb wäre es ja so toll, wenn die Bogenklassen und Altersklassen über ein Formular hinzugefügt, geändert, gelöscht usw werden könnten. Weil sonst bleibt das dann immer an mir hängen.

Aber Danke für alles,
Peter

RobertG
*******
Beiträge: 1638
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Select WHERE - Komplexe Abfragen und Kombinationen nicht händisch anpassen müssen

Beitrag von RobertG » Fr, 05.05.2017 19:36

Hallo Peter,
Ennstaler hat geschrieben:
Fr, 05.05.2017 17:13
Ich glaub, das ist mir jetzt zu hoch, denn wie soll "zeile" ohne ="Jugend" wissen, welche der 4 Beispielaltersklassen zu laden ist?
Die Altersklassen haben doch ein `alter_min` und ein `alter_max`. Das ist, soweit ich Alterklassen verstehe, zumindest zusammen ein eindeutiges Zeichen für eine Altersklasse.

Code: Alles auswählen

`a`.`alter` BETWEEN `alter_min` AND `alter_max`
Hier wird in Deiner `teilnehmer`-Tabelle in der jeweiligen Zeile nachgeschaut, welches Alter vermerkt ist (ich nehme an, dass das anderswo berechnet wurde). Dieses Alter muss zwischen den Werten von `alter_min` und `alter_max` liegen. Damit ist doch die Alterklasse bestimmbar. Allerdings müsstest Du die Überschneidungen in den Altersklassen entweder raus nehmen oder die Altersklasse fest bei den Teilnehmern verankern, wenn Du die "Senioren" als Teil der Altersklasse "Erwachsene" siehst. Auch Deine Abfrage macht hier unmöglich zu erkennen, wem denn eine Person mit 60 Jahren zuzuordnen ist.

Wenn Du alle Teilnehmer zusammen erst einmal in einer Ansicht hast, dann kannst Du daraus z.B. prima eine gruppierte Teilnehmerliste oder auch eine gruppierte Ergebnisliste als Bericht erstellen.

Einzelne Alterklassen kannst Du durch einen Filter über das Formular herausfiltern. So ein Filter sollte nicht fest in die Abfrage geschrieben werden. Dann bräuchtest Du, abhängig von Deinen Wünschen, so viele Abfragen wie Du an Filterwerten erwartest.

Gruß

Robert

Ennstaler
**
Beiträge: 39
Registriert: Mi, 12.04.2017 07:31

Re: Select WHERE - Komplexe Abfragen und Kombinationen nicht händisch anpassen müssen

Beitrag von Ennstaler » Fr, 05.05.2017 20:08

Hallo Robert,

Ich danke dir/euch ehrlich für die tolle Hilfe. Es ist echt bewundernswert, was ihr euch antut. Ich versuche es nochmals zu erklären.

Es ist so:

Nehmen wir an, heute war ein Turnier.

Es waren die Bogenklassen:
1) Langbogen 2) Recurvebogen 3) Compoundbogen;

Alterklassen waren:

Kinder: 0 - 10 Jahre,
Jugend: 11-15 Jahre;
Erwachsene: 16 - 99 Jahre.



So, morgen ist wieder ein Turnier, wo aber mehr Bogenklassen und mehr Altersklassen sind.

Also erweitere ich über ein Formular die Tabelle "bogenklasse" auf:
1) Langbogen 2) Recurvebogen 3) Compoundbogen 4) Historiebogen 5) Selfbogen

Ebenso ändere ich über ein Formular die Tabelle "altersklasse" auf:

Kinder: 0-10 Jhare (bleibt gleich)
Jugend wird abgeändert auf Jugend_I (11-13 Jahre) und erweitert auf Jugend_II (14-16 Jahre),
Erwachsene wird eingeteilt in AK_1, AK-2, AK_3 mit dementsprechenden Altersangaben.



Und wie bringe ich nun diese neuen oder geänderten Abfragen (die Namen ändern sich ja bzw es kommen neue hinzu) dynamisch in eine Abfrage.

Zum nochmaligen Verständnis so wie es derzeit aussieht an Hand der Jugendklasse (wohl gemerkt, es ist nur eine Jugendklasse derzeit) mit 4 Bogenklassen:

1) Abfrage Jugend Gesamt (alle Bögen, Damen und Herren)
2) Abfrage Jugend Langbogen
3) Abfrage Jugend Recurvebogen
4) Abfrage Jugend Selfbogen
5) Abfrage Jugend Compoundbogen

6) Abfrage Jugend Damen Langbogen
7) Abfrage Jugend Damen Recurvebogen
8) Abfrage Jugend Damen Selfbogen
9) Abfrage Jugend Damen Compoundbogen

10) Abfrage Jugend Herren Langbogen
11) Abfrage Jugend Herren Recurvebogen
12) Abfrage Jugend Herren Selfbogen
13) Abfrage Jugend Herren Compoundbogen

Das sind jetzt 13 statistische Abfragen bei nur 1 Jugendklasse und bei NUR 4 Bogenklassen.

Jetzt hab ich da aber noch die Gesamtwertung, Mannschaftswertung, Erwachsene, Kinder....

Das müsste doch möglich sein, dass man 1 Abfrage über ein Formular steuert, wo die gesamten Altersklassen und Bogenklassen
über eine Platzhalter notiert werden und diese dann über ein Listenfeld ausgewählt werden.

Oder denke ich da komplett in eine falsche Richtung?

PS: Sorry schon mal, ich will da jetzt keine Stress verursachen, wenn es nicht geht, dann geht es halt nicht... bin aber trotzdem für jeden Denkanstoß dankbar.

Beste Grüße
Peter

RobertG
*******
Beiträge: 1638
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Select WHERE - Komplexe Abfragen und Kombinationen nicht händisch anpassen müssen

Beitrag von RobertG » Sa, 06.05.2017 09:09

Hallo Peter,

ich habe auf die Schnelle einmal ein Beispiel zusammengebaut, damit wird nicht nur über die Sache philosophieren. Deine Datenbank kannst Du ja wegen MySQL hier schlecht posten.

Die Platzierungen habe ich noch nicht eingebaut, weil ich jetzt das Wetter für den Garten nutzen will.

Gruß

Robert
Dateianhänge
Sport.odb
(15.08 KiB) 38-mal heruntergeladen

RobertG
*******
Beiträge: 1638
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Select WHERE - Komplexe Abfragen und Kombinationen nicht händisch anpassen müssen

Beitrag von RobertG » Sa, 06.05.2017 11:21

... und hier die in der Kaffeepause um die Platzierungen ergänzte Version ...
Dateianhänge
Sport.odb
(15.76 KiB) 35-mal heruntergeladen

Ennstaler
**
Beiträge: 39
Registriert: Mi, 12.04.2017 07:31

Re: Select WHERE - Komplexe Abfragen und Kombinationen nicht händisch anpassen müssen

Beitrag von Ennstaler » Sa, 06.05.2017 12:40

Servus Robert...boahhh.... du bist der spitze, langsam dämmert es mir, was du immer gemeint hast.

Würde mich gerne irgendwie erkenntlich zeigen, weil ohne die große Hilfe wär das für mich nie zu schaffen gewesen. Kann man irgendwo spenden oder so?

Beste Grüße,
Peter

RobertG
*******
Beiträge: 1638
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Select WHERE - Komplexe Abfragen und Kombinationen nicht händisch anpassen müssen

Beitrag von RobertG » Sa, 06.05.2017 19:17

Hallo Peter,

die einzige Spendenadresse, die ich kenne, ist http://de.libreoffice.org/donate/. Von den Spenden profitieren alle, die an der Community von LO aktiv mitarbeiten. Server müssen bezahlt werden, Unterkünfte bei Treffen von z.B. der deutschsprachigen Community ...

Gruß

Robert

Ennstaler
**
Beiträge: 39
Registriert: Mi, 12.04.2017 07:31

Re: Select WHERE - Komplexe Abfragen und Kombinationen nicht händisch anpassen müssen

Beitrag von Ennstaler » Sa, 06.05.2017 19:37

Danke Robert, ich hab ein kleines "Dankeschön" übermittelt.

RobertG
*******
Beiträge: 1638
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Select WHERE - Komplexe Abfragen und Kombinationen nicht händisch anpassen müssen

Beitrag von RobertG » So, 07.05.2017 20:56

Kleine Ergänzung zu der Beispieldatenbank:
F3K Total hat mich darauf hingewiesen, dass die Filterung nach dem Geschlecht der Personen sich nicht auf ein leeres Feld zurücksetzen lässt. Ich habe das mit meiner aktuellen LO-Version erstellt, und dort funktionierte das ohne Probleme. Der Fehler tritt in allen LO-Versionen vor 5.* und in AOO auf.

Für diese Versionen muss die Ansicht "Komplett" geändert werden:

Code: Alles auswählen

... AND "a"."Geschlecht" = IFNULL( ( SELECT "Geschlecht" FROM "Filter" WHERE "ID" = 1 ), "a"."Geschlecht" )...
muss zu

Code: Alles auswählen

... AND "a"."Geschlecht" = IFNULL( NULLIF( ( SELECT "Geschlecht" FROM "Filter" WHERE "ID" = 1 ),''), "a"."Geschlecht" )...
In Base-Formularen ist es normalerweise üblich, aus einem leeren Formularfeld NULL an die Datenbank weiter zu geben. Bei dem entsprechenden Listenfeld wird aber in AOO und auch in LO bis einschl LO 4.4 ein leerer Text wiedergegeben. Dann lauft die Abfrage nach einem leeren Feld (IFNULL) ins Leere. Durch die Änderung wird das Feld jetzt auch als leeres Feld interpretiert, wenn dort leere Text enthalten ist.

Gruß

Robert

Ennstaler
**
Beiträge: 39
Registriert: Mi, 12.04.2017 07:31

Re: Select WHERE - Komplexe Abfragen und Kombinationen nicht händisch anpassen müssen

Beitrag von Ennstaler » Mo, 08.05.2017 06:22

Vielen Dank für die ausführlichen Informationen und rasche Hilfe.
Beste Grüße,
Peter

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste