SQL join

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
blackm
Moderator und Co-Admin
Beiträge: 5921
Registriert: 02.06.2002 15:03:17
Lizenz eigener Beiträge: MIT Lizenz

SQL join

Beitrag von blackm » 19.11.2004 22:49:42

Hi,

ich komm bei einem join nicht weiter. Ich hab zwei Tabellen:

Code: Alles auswählen

mysql> describe framework_groups;                      
+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| gid         | int(10) unsigned |      | PRI | NULL    | auto_increment |
| name        | varchar(255)     |      |     |         |                |
| description | varchar(255)     | YES  |     | NULL    |                |
+-------------+------------------+------+-----+---------+----------------+
und

Code: Alles auswählen

mysql> describe framework_user_group;
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(10) unsigned |      | PRI | NULL    | auto_increment |
| uid   | int(10) unsigned |      |     | 0       |                |
| gid   | int(10) unsigned |      |     | 0       |                |
+-------+------------------+------+-----+---------+----------------+
In der ersten Tabelle sind gruppen gespeichert und in der zweiten dann die Zuordnung welcher user in welcher gruppe ist. Jetzt moechte ich die Gruppen heraussuchen, in der ein bestimmter user noch nicht ist. Hoert sich einfach an, aber irgendwie steh ich da aufn Schlauch (oder es ist wirklich nicht so einfach).
Angefangen habe ich mit folgendem:

Code: Alles auswählen

SELECT * FROM framework_groups AS g, framework_user_group AS ug WHERE ug.uid = '1';
Der * ist nur erstmal fuer die bessere uebersicht....

Das war ja noch der leichte Teil...aber der Rest...vielleicht habt ihr ja ne ahnung :-)

by, Martin
Schöne Grüße

Martin

Neu im Forum? --> https://wiki.debianforum.de/debianforum ... tensregeln
Log- und Konfigurationsdatein? --> pastebin.php
Forum unterstützen? --> https://wiki.debianforum.de/debianforum.de/Spenden

Benutzeravatar
Abraxax
Beiträge: 774
Registriert: 22.03.2004 10:18:42
Wohnort: Rheinkreis-Neuss.NRW.DE

Beitrag von Abraxax » 19.11.2004 23:21:16

ungetestet. ;-)

Code: Alles auswählen

SELECT
    g.gid,
    g.name,
    ug.uid,
    ug.gid
FROM
    framework_groups g
        LEFT JOIN framework_user_group ug USING(gid)
WHERE
    ISNULL(ug.gid) AND
    ug.uid = 1
sollte es probleme mit dem ISNULL() im WHERE geben, nimm mal diese query hier ....

Code: Alles auswählen

SELECT
    g.gid,
    g.name,
    ug.uid,
    ug.gid
FROM
    framework_groups g
        LEFT JOIN framework_user_group ug USING(gid)
WHERE
    ug.uid = 1
HAVING
    ISNULL(ug.gid)

Benutzeravatar
blackm
Moderator und Co-Admin
Beiträge: 5921
Registriert: 02.06.2002 15:03:17
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von blackm » 20.11.2004 00:17:25

Hi Abraxax,

der Ansatz ueber ISNULL(ug.gid) funktioniert leider nur wenn noch niemand in der Gruppe ist....

by, Martin
Schöne Grüße

Martin

Neu im Forum? --> https://wiki.debianforum.de/debianforum ... tensregeln
Log- und Konfigurationsdatein? --> pastebin.php
Forum unterstützen? --> https://wiki.debianforum.de/debianforum.de/Spenden

Olaf Dietsche
Beiträge: 520
Registriert: 12.06.2003 23:18:50
Wohnort: Siegburg

Beitrag von Olaf Dietsche » 20.11.2004 00:23:58

Wie wär's ohne join, aber mit subselect?

Code: Alles auswählen

select * from framework_groups
where gid not in (select gid from framework_user_group where uid = 1)

ernohl
Beiträge: 1248
Registriert: 04.07.2002 08:11:56
Wohnort: HL

Beitrag von ernohl » 20.11.2004 00:33:11

Um welches SQL geht es denn?

Code: Alles auswählen

select gid from framework_groups where gid not in (select gid from framework_user_group where uid= '1');
Gruß
ernohl

Benutzeravatar
blackm
Moderator und Co-Admin
Beiträge: 5921
Registriert: 02.06.2002 15:03:17
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von blackm » 20.11.2004 00:37:03

An so ein subselect habe ich auch schon gedacht...nur mysql (es geht um mysql ;-) ) kann das erst ab 4.1 und das ist erst in experimental :cry:
Schöne Grüße

Martin

Neu im Forum? --> https://wiki.debianforum.de/debianforum ... tensregeln
Log- und Konfigurationsdatein? --> pastebin.php
Forum unterstützen? --> https://wiki.debianforum.de/debianforum.de/Spenden

Benutzeravatar
Abraxax
Beiträge: 774
Registriert: 22.03.2004 10:18:42
Wohnort: Rheinkreis-Neuss.NRW.DE

Beitrag von Abraxax » 20.11.2004 08:20:15

blackm hat geschrieben:Hi Abraxax,

der Ansatz ueber ISNULL(ug.gid) funktioniert leider nur wenn noch niemand in der Gruppe ist....

by, Martin
stell mal ein paar testdaten (dump der tables mit demodaten) online.

dann kann ich das nachher mal testen. habs nur nach gefühl gemacht. ;-)

Benutzeravatar
blackm
Moderator und Co-Admin
Beiträge: 5921
Registriert: 02.06.2002 15:03:17
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von blackm » 20.11.2004 10:15:46

Schöne Grüße

Martin

Neu im Forum? --> https://wiki.debianforum.de/debianforum ... tensregeln
Log- und Konfigurationsdatein? --> pastebin.php
Forum unterstützen? --> https://wiki.debianforum.de/debianforum.de/Spenden

Benutzeravatar
ckihm.deb
Beiträge: 263
Registriert: 26.12.2002 18:49:38
Wohnort: Saarbrücken

Beitrag von ckihm.deb » 20.11.2004 10:46:05

Code: Alles auswählen

SELECT *
 FROM framework_groups AS g LEFT JOIN framework_user_group AS ug on ( ug.uid = '1' and ug.gid == g.gid) 
where ug.gid is NULL;
Ungetestet. Die Idee dahinter ist die:
Es werden die beiden Tabellen so verknüpft das immer wenn ug.uid = 1 und ug.gid == g.gid ist ( also der gesuchte User in der Gruppe ist) eine Zeile gebildet wird. Durch den left join werden aber auch alle Gruppen aus g übernommen in denen der User nicht ist. Die entsprechenden spalten aus ug werden mut NULL werten gefüllt. Gibt man nun in der where Bedingung ug.gid is NULL an, dürften nur noch die Zeilen mit den Gruppen in denen der User nicht ist auftauchen.

Gruss
christian
christian

Benutzeravatar
blackm
Moderator und Co-Admin
Beiträge: 5921
Registriert: 02.06.2002 15:03:17
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von blackm » 20.11.2004 10:59:36

:hail: :hail: :hail: Es geht! Ist nur ein kleiner Fehler in deinem SQL (nicht == sondern = bei ug.gid == g.gid)

Danke christian! Du hast mein Wochenende gerettet. Danke auch an die anderen Ideen.

by, Martin
Schöne Grüße

Martin

Neu im Forum? --> https://wiki.debianforum.de/debianforum ... tensregeln
Log- und Konfigurationsdatein? --> pastebin.php
Forum unterstützen? --> https://wiki.debianforum.de/debianforum.de/Spenden

Benutzeravatar
ckihm.deb
Beiträge: 263
Registriert: 26.12.2002 18:49:38
Wohnort: Saarbrücken

Beitrag von ckihm.deb » 20.11.2004 11:10:50

:D gerne geschehen. Meistens bin ich ja der dem geholfen wird. Schön wenn es auch mal anderst herum ist.
christian

Antworten