kniffliges mysql query Problem

  • Ersteller birdseedmusic
  • Erstellt am
birdseedmusic

birdseedmusic

Administrator
Registriert
13.04.02
Beiträge
7.294
Reaktionen
1.544
Punkte
25.527
Hi Leute

So ich hab hier gerade ma n mysql 3.23 SQL Query Problem wo ich irgendwie nich weiterkomme und auf einen allwissenden Meister hoffe.

Also wir haben eine Tabelle in der Form

user-id group-id
1 1
2 1
2 2
3 1
3 2

Es ist eine Tabelle, die sagt, User x ist in Gruppe y. Also eine klassische n:m Beziehung. Nun möchte ich alle User herausfinden, die sowohl in der Gruppe 1 als auch in der Gruppe 2 sind.

Idealerweise müsste man das ohne Subselect lösen, weil mysql 3.23 noch keine Subselects unterstützt.

Jemand eine Idee?

gruss
MK
 
Du bist hier bei Home-R e c o r d i n g .de
Und nicht bei Home-Computer.de !




Sollte ein schlechter Scherz sein ..



Viel Glück
fmo
 
Hi

Au mist, ich dachte ich wär beim HOMOrecording.de :D

So jetzt aber genug gespammt, ich brauch Antworten :D

gruss
MK
 
hm....
Na mit nem AND funktionierts nicht?
Ohne Subqueries is halt scho blöd.
 
spontan hätte ich da folgenden workaround:

du erweiterst deine tabelle um eine 3.spalte in der du speicherst, wie oft ein User einer Gruppe zugeordnet ist.

Im Normalfall ist jeder User einer Gruppe zugeordnet - kein Thema.
Die User, die mehreren Gruppen zugeordnet sind, haben dann dort eine andere/höhere Zahl.
Die kannst du dann herausfiltern.

Weißt du wie ich es meine?

Sowas könntest du sogar temporär mit 1-2 Schleifendurchläufen machen.
Keine große Sache also.
 

Sie müssen nicht unbedingt zwei verschiedene Tabellen haben, um eine Verknüpfung (Join) durchzuführen. Manchmal ist es nützlich, eine Tabelle mit sich selbst zu verknüpfen, wenn Sie nämlich Datensätze in einer Tabelle mit Datensätze in derselben Tabelle vergleichen wollen. Um zum Beispiel Zuchtpaare unter Ihren Haustieren zu finden, können Sie die pet-Tabelle mit sich selbst verknüpfen, um Paare von männlichen und weiblichen Tieren derselben Art zusammen zu bringen:

mysql> SELECT p1.name, p1.geschlecht, p2.name, p2.geschlecht, p1.art
-> FROM pet AS p1, pet AS p2
-> WHERE p1.art = p2.art AND p1.geschlecht = "w" AND p2.geschlecht = "m";
+--------+-------------+--------+-------------+---------+
| name | geschlecht | name | geschlecht | art |
+--------+-------------+--------+-------------+---------+
| Fluffy | w | Claws | m | Katze |
| Buffy | w | Fang | m | Hund |
| Buffy | w | Bowser | m | Hund |
+--------+-------------+--------+-------------+---------+

In dieser Anfrage legen wir Aliase für den Tabellennamen fest, um auf die Spalten verweisen zu können und um auseinander zu halten, auf welche Instanz der Tabelle sich jede Spaltenreferenz bezieht.
 
Hallo,

also ohne Subselects ists natürlich blöd, deswegen musst du afaik ein bisschen Logik ins PHP Skript einbauen. Ich habs mal mit folgendem Query ausprobiert:

select user_id, count(user_id) from usergroup where group_id=1 or group_id=2 group by user_id

Damit kriegst du in der zweiten Spalte die Anzahl der Gruppen. Wenn diese Anzahl 2 ist, dann ist der User in beiden Gruppen vorhanden. Ich gehe mal davon aus, dass der Primärschlüssel aus beiden Spalten besteht und damit ein User nur einmal zu einer Gruppe zugeordnet wird. Hab gerade noch einen dritten Datensatz eingefügt (zum Testen), in dem ich User 3 der Gruppe 3 zugeordnet habe, hat auch funktioniert.
 
Hi

Hab mit Access SQL und deiner Tabelle ein bisschen rumgespielt:
Dabei ist T deine Beispieltabelle, u die User und g die Gruppen:

SELECT T1.u, T1.g
FROM T AS T1, T AS T2
WHERE T1.u=T2.u And T1.g<>T2.g;


Liefert
U G

2 2
2 1
3 2
3 1

Grüsse

EDIT: die kleiner und grösser Zeichen zwischen T1.G und T2.g im WHERE sieht man nicht (eh klar)
Also eigentlich :T1.g UNGLEICH T2.g (oder T1.g !=T2.g wenns in C wäre)
 
hmm... wenn ich Bird richtig verstanden hab, möchte er als Ergebnis User 2 und 3 haben
(weil die beiden in Gruppe 1 UND 2 sind) - und das geht so (hoffe ich jedenfalls :)):

SELECT
t1.user_id
FROM
tabelle AS t1
LEFT JOIN
tabelle AS t2
ON t1.user_id=t2.user_id
WHERE
t1.group_id=1
AND
t2.group_id=2;

Liebe Grüße
chris


EDIT:
@birdseed & stonyroad:

da stonyroads und meine Variante äquivalent zu sein scheinen, würde ich
sein SQL empfehlen, schon allein wegen der besseren Lesbarkeit :)
allerdings sollte es dann ggf. eher so aussehen:
SELECT T1.user_id
FROM
tabelle AS T1,
tabelle AS T2
WHERE
T1.user_id=T2.user_id
AND
T1.group_id=1
AND
T2.group_id=2;

wenn die Tabelle "sauber" ist, kannst Du Dir auch das DISTINCT bzw. GROUP BY sparen,
macht die Abfrage bestimmt flotter...

Brainsaws Idee ist ebenfalls nicht soo schlecht, dürfte aber die meiste Zeit benötigen -
sein SQL etwas eleganter:
SELECT user_id FROM tabelle
WHERE group_id IN (1, 2) GROUP BY user_id HAVING COUNT(*)=2;

Gruz
 
DonChris schrieb:
hmm... wenn ich Bird richtig verstanden hab, möchte er als Ergebnis User 2 und 3 haben
(weil die beiden in Gruppe 1 UND 2 sind) - und das geht so (hoffe ich jedenfalls :)):



Hab ich überlesen. Dann eben:

SELECT <b>DISTINCT T1.u </b>
FROM T AS T1, T AS T2
WHERE T1.u=T2.u And T1.g!=T2.g;

Grüsse
 
Hi,
bin wie immer zu spät, aber Stony hats. Self-Join mit distinct, das isses.
Grüße
Edgar
 
Probier es mal damit:

SELECT userid, count(*) FROM user2group u
group by userid having count(*) > 1

Oder war das nicht nicht Aufgabenstellung :D
 
Hi Leutz

Holla, danke für die vielen Antworten! Werds gleich heute abend ma ausprobieren.

lg
Michael
 

Ähnliche Themen

moonbooter
    • Danke
  • Artikel
Antworten
10
Aufrufe
2K
Audix
A
moonbooter
    • Danke
  • Artikel
Antworten
5
Aufrufe
7K
YogiX
Y
moonbooter
    • Danke
  • Artikel
Antworten
5
Aufrufe
11K
Psylok
Psylok

Oft gelesene Themen

Zurück
Oben