Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Lookup mit mehreren Kategorien und Werten als AND-Abfrage (https://www.delphipraxis.net/147427-lookup-mit-mehreren-kategorien-und-werten-als-abfrage.html)

Alien426 8. Feb 2010 12:02

Datenbank: SQLite • Version: 3 • Zugriff über: Simple SQLite 3.0 wrapper

Lookup mit mehreren Kategorien und Werten als AND-Abfrage
 
Hallo.

Ich beschreibe am besten erst mal meine Tabellen:

project: Enthält Handle (wie eine ID anzusehen) und Titel der Projekte
Code:
Handle            | Title              |
-------------------+---------------------+
Deus Ex 1          | Deus Ex            |
Beyond Good & Evil | Beyond Good & Evil |
categ: Enthalt die IDs und Namen der Kategorien
Code:
ID | Name   |
----+---------+
2   | Period |
3   | Genre  |
value: Entält mögliche Werte, die den Kategorien zugeordnet sind
Code:
ID | categID | Name      |
----+----------+------------+
3   | 3        | Adventure |
4   | 3        | RPG       |
15  | 2        | 2000-2004  |
pro_val: Die Lookup-Table, die alles vereinigt. Pro Projekt können alle Kategorien mit einem Wert belegt werden.
Code:
projectHandle | categID | valueID |
---------------+----------+---------+
Deus Ex 1      | 2        | 15      |
Deus Ex 1      | 3        | 4       |
Test          | 2        | 15      |
(Mir ist klar, dass ich auf categID verzichten könnte, da valueID fortlaufend ist.)

Jetzt möchte ich die Projekte so ähnlich wie in MS Query selektieren können. Es sollen nach bedarf Spalten und Zeilen hinzugefügt werden können. Die Spalten sollen mit AND verknüpft werden, die Zeilen mit OR. Die Kategorien und Werte (also alle 5 Elemente in Spalte 2 und 3) sind jeweils als Dropdowns realisiert.

Code:
+---------------+---------------+---------------+
|category      | Period       | Genre        |
|               | 2000-2004     | Action       |
|       or     | 2005-2009     |               |
+---------------+---------------+---------------+
Das Ergebnis in Pseude-SQL-Form:
SQL-Code:
... WHERE (Period='2000-2004' AND Genre='Action') OR (Period='2005-2009')
Also alle Projekte, die entweder dem Genre "Action" angehören und Anfang der 2000er erschienen sind oder Projekte, die Ende der 2000er erschienen sind.

Wenn ich pro Zeile nur einen Wert wähle klappt es, aber sobald ein AND kommt (natürlich) nicht, da ja ein Datensatz aus pro_val nicht zwei Kategorie/Wert-Anforderungen gleichzeitig erfüllen kann.

Wie mache ich die Abfrage in SQL?

p80286 8. Feb 2010 13:01

Re: Lookup mit mehreren Kategorien und Werten als AND-Abfrag
 
Hallo alien426

ich vermute mal das Du da ein etwas ungeschicktes Beispiel konstruiert hast, denn sollten Deine Daten real so aussehen sind Probleme natürlich vorprogrammiert.

Da PRO_VAL sowohl Schlüssel für VALUE und CATEGORIE enthält, diese beiden aber auch noch untereinander in Beziehung stehen, rate ich Dir, da erst einmal aufzuräumen. Es könnte irgendwann einmal dazu kommen das diese beiden Beziehungen sich gegenseitig ausschließen, und das wäre wohl nicht in Deinem Sinne.

Auch dieses
Code:
ID | categID | Name      | 
----+----------+------------+ 
3   | 3        | Adventure | 
4   | 3        | RPG       | 
15  | 2        | 2000-2004  |
CATEGID=3 Name='Adventure' oder 'RPG' oder ?????
ist wahrlich nicht sehr glücklich

Zu Deiner Urprungsfrage:
benutze ein Union etwa so:
SQL-Code:
SELECT..... FROM....
WHERE ..='2000-2005' and ...='Adventure'
UNION
SELECT..... FROM....
WHERE ..='2006-2009' and ...='Adventure'

Gruß
K-H

Alien426 8. Feb 2010 14:29

Re: Lookup mit mehreren Kategorien und Werten als AND-Abfrag
 
Wie schon geschrieben könnte (sollte) ich mir in "pro_val" die Kategorie (categID) sparen.

Ich bin auch nicht generell gegen eine Veränderung des Datenbankaufbaus. Aber ich denke, dass man durch den bisherigen Aufbau sehr flexibel ist. Das anders nachzubilden ist wahrscheinlich schwierig.

In "value" ist aber eine categID nötig. categID=3 bedeutet ja, dass es sich um die Kategorie "Genre" handelt.

Das UNION ist aber im Prinzip wie ein AND; es werden Datensätze dazugefügt. Da aber die Verarbeitung erst zeilenweise und dann spaltenweise erfolgen muss, muss auch das AND vor dem OR erfolgen.

p80286 8. Feb 2010 15:03

Re: Lookup mit mehreren Kategorien und Werten als AND-Abfrag
 
das UNION ist kein AND!
Im Gegenteil es ist eher ein OR da mit Hilfe von UNION zwei oder mehr Ergebnismengen zusammen gefügt werden.

das AND bedeutet ja das beide Bedingungen erfüllt sein müssen also
Genre=Action AND Zeitraum=2000-2005

Gruß
K-H

Alien426 8. Feb 2010 18:28

Re: Lookup mit mehreren Kategorien und Werten als AND-Abfrag
 
Okay, du hast vollkommen recht was UNION an geht. Aber das Hauptproblem sind ja die ANDs, die mehrere Werte verknüpfen sollen. "...='2000-2005' and ...='Adventure'" funktioniert nicht, weil "2000-2005" und "Adventure" in unterschiedlichen Datensätzen stehen und somit nicht gleichzeitig erfüllt werden können.

Hast du noch eine Idee?

Irgendwie muss man doch die Daten von einem Handle in einen Datensatz kriegen können...

Alien426 16. Feb 2010 06:51

Re: Lookup mit mehreren Kategorien und Werten als AND-Abfrag
 
Ich gehe davon aus, dass man Many-To-Many-Relationen in einer SQL-Abfrage nicht mit AND verknüpfen kann. Deshalb habe ich das Thema als erledigt gekennzeichnet.

Ich habe jetzt das Problem so gelöst, dass ich die Bedingungen einzeln abfrage und anschließend die Ergebnisse bearbeite. Im Moment code ich das noch nicht in Delphi, sondern zum Testen in PHP. Aber man kann die benutzten Funktionen (array_intersect() für AND und array_merge() für OR) in Delphi bestimmt leicht nachbauen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz