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
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
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 ;)
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.
ö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
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!
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.