Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi [SQL] Verknüpfungs Problem (https://www.delphipraxis.net/40538-%5Bsql%5D-verknuepfungs-problem.html)

MarcusB 17. Feb 2005 10:22

Datenbank: MySQL • Version: 4.0.22 • Zugriff über: n/a

[SQL] Verknüpfungs Problem
 
Hallo,

ich häng mal wieder :gruebel:

Ich habe 2 Tabellen, in der einen sind Produkte gespeichert in der anderen deren Einsatzgebiete etwa so (stark vereinfacht):

Code:
Tabelle 1:

id|name     |
--+----------+
1 |Bohrer   |
2 |Hammer   |

Tabelle 2:

pid|name     |
---+----------+
1  |schlagen |
1  |schrauben |
2  |schlagen |
1  |bohren   |

(pid=pi)
Zusätzlich habe ich eine Suchmaske in der man die Einsatzgebiete anhaken kann.

Wie muss meine SQL-Abfrage aussehen, damit ich z.B. herausfinde welches Gerät schlagen und bohren kann?

Ich hoffe ihr versteht was ich meine :wall:

czapie 17. Feb 2005 10:34

Re: [SQL] Verknüpfungs Problem
 
SQL-Code:
SELECT tabelle1.name FROM tabelle1, tabelle2 WHERE tabelle1.id = tabelle2.pid AND tabelle2.name = 'schlagen'
Meinst du so?

MarcusB 17. Feb 2005 10:42

Re: [SQL] Verknüpfungs Problem
 
Ja, im Prinzip schon, aber das Problem entsteht, wenn ich nach 'schlagen' UND 'bohren' suchen will.
Wenn ich nämlich einfach noch eine AND Klausel dranhänge wirds ja immer falsch :(

SirThornberry 17. Feb 2005 10:46

Re: [SQL] Verknüpfungs Problem
 
dann muss es eben
SQL-Code:
SELECT tabelle1.name FROM tabelle1, tabelle2 WHERE tabelle1.id = tabelle2.pid AND tabelle2.name = 'schlagen' AND tabell2.name = 'bohren'
heißen. nur hätte das ja keinen sinn weil nie beides vorkommen kann. also musstest du einfach mal or anstelle des letzten "AND" nehmen
SQL-Code:
SELECT tabelle1.name FROM tabelle1, tabelle2 WHERE tabelle1.id = tabelle2.pid AND (tabelle2.name = 'schlagen' OR tabell2.name = 'bohren')

shmia 17. Feb 2005 10:54

Re: [SQL] Verknüpfungs Problem
 
Zitat:

Zitat von MarcusB
Ich habe 2 Tabellen, in der einen sind Produkte gespeichert in der anderen deren Einsatzgebiete etwa so (stark vereinfacht):
Code:
Tabelle 1:
id|name     |
--+----------+
1 |Bohrer   |
2 |Hammer   |

Tabelle 2:
pid|name     |
---+----------+
1  |schlagen |
1  |schrauben |
2  |schlagen |
1  |bohren   |

Du brauchst 3 Tabellen:
Tabelle 1 mit Geräten, Tabelle 2 mit Aktionen, Tabelle 3 stellt eine N:M Verknüpfung zwischen
Tabelle 1 & 2 her.
Code:
Tabelle 1:
idDevice|name     |
--------+----------+
1       |Bohrer   |
2       |Hammer   |
Tabelle 2:
idAction|name     |
--------+----------+
1       |schlagen |
2       |schrauben |
3       |bohren   |
Tabelle 3:
idDevice|idAction |
--------+----------+
1       |3         |
2       |1         |

czapie 17. Feb 2005 11:01

Re: [SQL] Verknüpfungs Problem
 
@shmia ich finde deine Lösung eindeutig sauberer und schöner, aber ich glaube nicht, dass das in diesem Fall zwingend notwendig ist. Mir fällt kein Fall ein, bei dem die aktuelle Lösung versagen würde.

MarcusB 17. Feb 2005 11:13

Re: [SQL] Verknüpfungs Problem
 
Ich hab mir schon gedacht, dass das kompliziert wird.

Das mit dem OR funktiniert leider nicht, da ich nur Geräte will, die BEIDES können.

Danke auch für den Tipp mit der 3. Tabelle, aber da kriege ich Probleme, da da schon ein Haufen Skripte drumherum sind, die dann alle geändert werden müssten :(

Aber wenns keine andere Möglichkeit gibt, werde ichs wohl so machen müssen.

lume96 17. Feb 2005 11:15

Re: [SQL] Verknüpfungs Problem
 
Zitat:

Zitat von czapie
@shmia ich finde deine Lösung eindeutig sauberer und schöner, aber ich glaube nicht, dass das in diesem Fall zwingend notwendig ist. Mir fällt kein Fall ein, bei dem die aktuelle Lösung versagen würde.

Wenn man nur mit zwei Tabellen arbeitet, dann heisst das, dass für jedes neue Produkt die Einsatzgebiete manuell hinzugefügt werden, man muss also jedes Mal "bohren", etc.. schreiben.

Ein Tippfehler bzw. Gross-Kleinschreibung und schon gibt's Probleme, den dann steht für Hammer vielleicht schlagen und für Bohrer Schlagen.

Ausserdem schreibt Marcus, dass er eine Suchmaske hat, in der man das Einsatzgebiet wählen muss. Wie will er die Maske den automatisch füllen, ohne doppelte Einträge zu bekommen (ich weiss SELECT DISTINCT, ist aber nicht sauber).

Ich würde auf jeden Fall zu drei Tabellen raten, so wie shmia rät.

Tschüss,
Lutz

MarcusB 17. Feb 2005 11:45

Re: [SQL] Verknüpfungs Problem
 
@lume96: Das ist ja stark vereinfacht dargestellt, die Werte wie "schlagen" und "bohren" etc. kommen ja aus einer dritten Tabelle,
aber jetzt habe ich ein Verständnisproblem.
Wenn ich wie vorgeschlagen 3 Tabellen mache habe ich doch das gleiche Problem, oder?

Code:
Tabelle 1:
idDevice|name     |
--------+----------+
1       |Bohrer   |
2       |Hammer   |
Tabelle 2:
idAction|name     |
--------+----------+
1       |schlagen |
2       |schrauben |
3       |bohren   |
Tabelle 3:
idDevice|idAction |
--------+----------+
1       |3         | <-- (Bohrer bohrt)
2       |1         |
1       |2         | <-- (Bohrer schraubt)
Ich komm nicht auf das Statement, dass mir Geräte mit "bohrt" UND "schraubt" liefert :wall:
Das ganze wird ja noch ein bischen komplizierter, weil in dem Suchformular beliebig viele Einsatzgebiete angehakt werden können.

:gruebel:

lume96 17. Feb 2005 12:11

Re: [SQL] Verknüpfungs Problem
 
Moin,

bezogen auf die beiden Tabellen in Deinem ersten Eintrag würde das ungefähr so aussehen :
SQL-Code:
SELECT p.name FROM tabelle1 p, tabelle2 t1, tabelle2 t2
WHERE p.id = t1.pid
AND p.id = t2.pid
AND t1.name = 'schlagen'
AND t2.name = 'bohren'
Hab's jetzt nicht geprüft, aber sollte in etwa so laufen. Ich glaube nicht, dass Du bei MySQL andere Lösungen hast.

Tschüss,
Lutz

alcaeus 17. Feb 2005 12:21

Re: [SQL] Verknüpfungs Problem
 
Und auf die 3 Tabellen:

SQL-Code:
SELECT * FROM devices d, actions a, deviceactions da
WHERE d.deviceid=da.deviceid
AND a.actionid=da.actionid
AND (a.action='bohren' OR a.action='schrauben')
Die Tabellen habe ich mal nicht mit Tabelle1-3 bezeichnet, da so die Verknüpfungen leichter ersichtlich werden.

Greetz
alcaeus

lume96 17. Feb 2005 13:35

Re: [SQL] Verknüpfungs Problem
 
Zitat:

Zitat von alcaeus
Und auf die 3 Tabellen:

SQL-Code:
SELECT * FROM devices d, actions a, deviceactions da
WHERE d.deviceid=da.deviceid
AND a.actionid=da.actionid
AND (a.action='bohren' OR a.action='schrauben')
Die Tabellen habe ich mal nicht mit Tabelle1-3 bezeichnet, da so die Verknüpfungen leichter ersichtlich werden.

Greetz
alcaeus

Das Problem ist aber, dass er ja nur das/die Produkt(e) haben will, auf das/die beide Aktionen zutreffen.

Ich wüsste jetzt nicht wie er, jedenfalls bei MySQL, ohne mehrfaches Einbinden der Tabelle "EINSATZGEBIETE" auskommt.

Tschüss,
Lutz

MarcusB 17. Feb 2005 20:47

Re: [SQL] Verknüpfungs Problem
 
Vielen Dank erstmal für Eure Beiträge. :hi:

Vielleicht gibt es ja auch einen ganz anderen Ansatz für die Problemstellung.
In Worten formuliert:

Es gibt eine variable Menge von Geräten und eine variable Menge von Eigenschaften.
Die Eigenschaften "hart" einzucoden macht keinen Sinn, da mit einem neuen Gerät auch neue Eigenschaften auftauchen können (um beim Beispiel zu bleiben: neues Gerät -> Hobel, neue Eigenschaft -> hobeln).

In der Suchmaske soll über die Eigenschaften die passenden Geräte selektiert werden.
(z.B. ich suche ein Gerät, welches sägen UND fräsen UND hobeln kann - also NICHT: sägen ODER fräsen ODER hobeln).

Ich finde einfach keinen Ansatz :wall:

[edit]@lume96: Nach Deinem Vorschlag müsste ich also bei 4 selektierten Eigenschaften die selbe Tabelle 4x einbinden?[/edit]

lume96 18. Feb 2005 08:30

Re: [SQL] Verknüpfungs Problem
 
Moin,

Zitat:

Zitat von MarcusB
Vielleicht gibt es ja auch einen ganz anderen Ansatz für die Problemstellung.
In Worten formuliert:

Es gibt eine variable Menge von Geräten und eine variable Menge von Eigenschaften.
Die Eigenschaften "hart" einzucoden macht keinen Sinn, da mit einem neuen Gerät auch neue Eigenschaften auftauchen können (um beim Beispiel zu bleiben: neues Gerät -> Hobel, neue Eigenschaft -> hobeln).

In der Suchmaske soll über die Eigenschaften die passenden Geräte selektiert werden.
(z.B. ich suche ein Gerät, welches sägen UND fräsen UND hobeln kann - also NICHT: sägen ODER fräsen ODER hobeln).

So hatte ich es schon verstanden.

Zitat:

Zitat von MarcusB
Ich finde einfach keinen Ansatz :wall:

:( Mein Vorschlag gefällt Dir also nicht ?

Zitat:

Zitat von MarcusB
[edit]@lume96: Nach Deinem Vorschlag müsste ich also bei 4 selektierten Eigenschaften die selbe Tabelle 4x einbinden?[/edit]

ich glaube nicht, dass es eine einfachere Lösung für Dein Problem gibt.

Wenn Du die Tabelle mit den Einsatzgebieten nur einmal einbeziehst, dann stösst Du unweigerlich auf das Problem das Du zwei (oder mehrere) Konditionen für den gleichen Record setzt (xx='bohren' AND xx='schrauben'). Das kann in einem und dem selben record natürlich nie zu einem positiven Ergebniss führen.

Eine andere Möglichkeit wäre unter Umständen ein INTERSECT (falls MySQL das unterstützt).

In diesem Falle stellt Du eine eigene Query für jeden Einsatzbereich her und verknüpfst die einzelnen Queries mit INTERSECT. Das gibt Dir dann die Schnittmenge, also nur die Ergebnisse, die in allen Queries vorkommen. Das Ganze könnte dann so aussehen :
SQL-Code:
/* Alle Produkte die 'schlagen' */
SELECT p.name FROM tabelle1 p, tabelle2 t
WHERE p.id = t.pid
AND t.name = 'schlagen'
INTERSECT /*Schnittmenge aus den beiden Queries*/
/* Alle Produkte die 'bohren' */
SELECT p.name FROM tabelle1 p, tabelle2 t
WHERE p.id = t.pid
AND t.name = 'bohren'
INTERSECT
blah blah blah ...
(Nicht geprüft)

Einfacher, bzw. kürzer wird die Query davon aber auch nicht und von der Performance her wird's auch nicht schneller (eher das Gegenteil).

Einziger Vorteil ist, dass sich die Query in Delphi vielleicht etwas leichter erstellen lässt, da die Basis ziehmlich fest ist.

Tschüss,
Lutz

MarcusB 18. Feb 2005 08:52

Re: [SQL] Verknüpfungs Problem
 
Zitat:

Zitat von lume96
Zitat:

Zitat von MarcusB
Ich finde einfach keinen Ansatz :wall:

:( Mein Vorschlag gefällt Dir also nicht ?

Nun, ich hatte gehofft, dass eine "einfachere" Möglichkeit besteht, denn irgendwie muss ich ja im Hintergrund dann sozusagen die Query "on-the-fly" generieren.

Das INTERSECT scheidet aus, da es leider noch nicht in MySQL (jedenfalls 4.x) nicht implementiert ist.

Aber vielen Dank für Deine Hinweise, jetzt muss ich halt mal in den sauren Apfel beissen :wink:

MarcusB 18. Feb 2005 11:00

Re: [SQL] Verknüpfungs Problem - gelöst!
 
Juhu, ich habe doch noch eine Möglichkeit gefunden! :hello:

Für alle, die mal ein ähnliches Problem haben sollten :

Code:
Tabelle 1:
id|name     |
--+----------+
1 |Bohrer   |
2 |Hammer   |

Tabelle 2:
pid|name     |
---+----------+
1  |schlagen |
1  |schrauben |
2  |schlagen |
1  |bohren   |

SELECT pid, COUNT( pid ) AS anz
FROM Tabelle2
WHERE name
IN (
'bohren', 'schrauben'
)
GROUP BY pid
HAVING anz = 2
:witch:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 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