PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit join



the4thele
27-12-2004, 10:12
Hallo erstmal

Ich bin zur zeit an einer kleinen Adressverwaltung und bin auf ein problem gestossen. Ich habe eine Tabelle mit Personen (tblAddress), eine Tabbelle mit Gruppen (tblGroup) und eine Link Tabelle (tblAddress_Group_Link) die das ganze verbindet. Heraus zufinden wer in welcher Gruppe ist, ist kein problem. Nur wer in 2 oder mehr Gruppen ist,da scheitere ich.
Ich hoffe ihr könnt mir bei dieser sache helfen.

hier noch die query mit der ich personen in einer gruppe suchen kann.

SELECT * FROM tbladdress LEFT JOIN tblAddress_Group_Link ON tblAddress.AddressId=tblAddress_Group_Link.Address Id WHERE GroupId=1

nEox
27-12-2004, 12:28
Hallo the4thele,

was genau suchst du?

Wenn du alle Adressen mit zugehörigen Gruppen haben willst würde ich 2 Statements machen. 1. Abfrage der Adressen und mit dem Ergebnis dann pro Adresse die Gruppe(n) auslesen.

Hoffe ich hab das Problem richtig verstanden...

see ya

nEox

the4thele
27-12-2004, 13:22
Das ist nicht ganz das was ich suche. Die Query ist für die Suchmaske. Sprich: der Benutzer gibt 2 oder mehr (mit einer gehts schon) Gruppen an und das program muss alle Addresen suchen die allen angegebenen Gruppen zugewiesen sind.


p.s.
so funktioniert es nicht....

SELECT * FROM tbladdress LEFT JOIN tblAddress_Group_Link ON tblAddress.AddressId=tblAddress_Group_Link.Address Id WHERE GroupId=1 AND GroupId=1

nEox
27-12-2004, 15:15
Hi the4thele,

Mach doch mit OR statt AND, wenns mit einer funktioniert.

Also:



SELECT
*
FROM
tbladdress
LEFT JOIN
tblAddress_Group_Link
ON
tblAddress.AddressId = tblAddress_Group_Link.Address Id

WHERE
GroupId=1 OR
GroupId=2

the4thele
27-12-2004, 15:46
das problem ist das ich dann alle addresen habe die in irgendeiner aufgeführt gruppe sind, ich will aber nur die die in beiden sind.

quinte17
27-12-2004, 17:15
klannst du beispielinhalte deiner 2 tabellen liefern? dann kann man sich vielleicht leichter vorstellen ;)

nEox
27-12-2004, 17:16
Hi,

hasts mal so probiert?



SELECT
*
FROM
tbladdress
LEFT JOIN
tblAddress_Group_Link
ON
tblAddress.AddressId = tblAddress_Group_Link.Address Id

WHERE
tblAddress_Group_Link.GroupId=1 OR
tblAddress_Group_Link.GroupId=2


see ya

nEox

the4thele
27-12-2004, 18:47
ja, hab ich ausprobiert. nur eben kommen hier alle die in der gruppe 1 oder in der gruppe 2 sind. Ich brauche eine query die mir nur datensätze zurück gibt die in beiden gruppen sind.

nEox
27-12-2004, 20:19
öm, kannst du evtl. kurz nen MySQL-Dump posten/schicken? Ich hätte evtl. die Lösung aber bevor ich dir jetzt schon wieder was falsches sage will ichs lieber vorher testen.

see ya

nEox

Hans-Georg Normann
27-12-2004, 22:30
Na dann will ich mich auch einmal versuchen:

Du kannst die tblAddress_Group_Link auch mit sich selbst Joinen.

Select *
tblAddress_Group_Link L1 LEFT JOIN tblAddress_Group_Link L2 ON (
L1.AddressId=L2.AddressId
AND L1.GroupId=1
AND L2.GroupID=2)Damit dürftest du genau die Links rausgeschmissen bekommen, welche in beiden Gruppen vorhanden sind.

Andere Alternative: Benutze die Having Clause.
SELECT
...........,
COUNT(*)
FROM
tbladdress
LEFT JOIN
tblAddress_Group_Link
ON
tblAddress.AddressId = tblAddress_Group_Link.Address Id

WHERE
tblAddress_Group_Link.GroupId=1 OR
tblAddress_Group_Link.GroupId=2
GROUP BY .................
HAVING COUNT(*) > 1

Hans

nEox
27-12-2004, 23:22
hi

Tabellen mit sich selbst joinen, die Ergebnisse per having prüfen - und wieder was dazugelernt :)

see ya

nEox

quinte17
28-12-2004, 09:23
hat nur den nachteil, dass man nicht variabel viele möglichkeiten hat.. (zumindest nicht ohne programmiertechnischen aufwand den select dynamisch zu erzeugen)
oder kennt da jemand eine lösung? (also gleiches problem, nur mit variabel vielen eigenschaften)

greetz

the4thele
28-12-2004, 09:26
danke euch allen! jetzt hat es geklappt!

nEox
28-12-2004, 11:34
hi quinte17,

eine Möglichkeit wäre über ein enum-Feld. Dann kann man auch die Group_Link Tabelle wegfallen lassen. Mysql Enum() (http://dev.mysql.com/doc/mysql/de/ENUM.html)
Nachteil hier ist das man bei einer neuen Gruppe auch das Enum-Feld erweitern muss. Im laufenden Betrieb sollte man das dann eigentlich nicht mehr machen. Aber wenn sich die Gruppen nicht mehr ändern ist eigentlich eine ganz gute Lösung.

see ya

nEox

Hans-Georg Normann
28-12-2004, 17:00
hat nur den nachteil, dass man nicht variabel viele möglichkeiten hat.. (zumindest nicht ohne programmiertechnischen aufwand den select dynamisch zu erzeugen)
oder kennt da jemand eine lösung? (also gleiches problem, nur mit variabel vielen eigenschaften)

greetzIch weiß nicht, was du mit dynamisch erzeugen meinst. Kannst du mal ein Beispiel bringen?

Vielleicht hilft dir aber auch STORED PROCEDURE weiter
(DOKUMENTATION HIER) (http://dev.mysql.com/doc/mysql/en/CREATE_PROCEDURE.html)Eigentlich nichts weiter als eine interne SELECT Abfrage, die sich aber für die User als Tabelle darstellt und auf die man dann wieder mit SELECT Statments zugreifen kann. Ich weiß aber nicht, ab welcher MySQL Version das geht.

Hans