MySQL nicht vorhandene JOINs
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
ansatz
beispiel
bekommen
benutzer
benutzername
code
dienen
gesendet benutzer
gesendet nachricht
http
jemand
message
nachricht
nachsehen
not
null
problem
struktur
tabelle
url
-
Hallo zusammen,
ich habe ein MySQL Problem.
Zur Situation:
Ich habe 3 Tabellen:
- Benutzer
- Nachrichten
- gesendet
Die Benutzer Tabelle beinhaltet allgemeine Benutzerdaten, der Benutzername ist der Primärschlüssel.
Die Tabelle Nachrichten beinhaltet Nachrichten, welche jeweils eine id (Primärschlüssel) haben
Außerdem habe ich eine Tabelle gesendet (Positionstabelle), welche den Benutzernamen und die id der Nachricht beinhaltet.
Mit JOINs kann ich im Großen und Ganzen umgehen. Jetzt habe ich aber das Problem, das ich z.B. alle Benutzer ausgeben möchte, die eine Nachricht noch nicht erhalten haben.
Hat jemand eine Lösung oder einen Tipp, wie ich den ON und den WHERE Part schreibe?
Vielen Dank!
PS: Ein besserer Titel ist mir nicht eingefallen -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Wenn ich das richtig verstanden habe, müsstest du Benutzer und gesendet left joinen und dann gucken wo die Nachrichten.id NULL ist.
-
fabi755 schrieb:
Hallo zusammen,
ich habe ein MySQL Problem.
Zur Situation:
Ich habe 3 Tabellen:
- Benutzer
- Nachrichten
- gesendet
Die Benutzer Tabelle beinhaltet allgemeine Benutzerdaten, der Benutzername ist der Primärschlüssel.
Die Tabelle Nachrichten beinhaltet Nachrichten, welche jeweils eine id (Primärschlüssel) haben
Außerdem habe ich eine Tabelle gesendet (Positionstabelle), welche den Benutzernamen und die id der Nachricht beinhaltet.
Mit JOINs kann ich im Großen und Ganzen umgehen. Jetzt habe ich aber das Problem, das ich z.B. alle Benutzer ausgeben möchte, die eine Nachricht noch nicht erhalten haben.
Hat jemand eine Lösung oder einen Tipp, wie ich den ON und den WHERE Part schreibe?
Vielen Dank!
PS: Ein besserer Titel ist mir nicht eingefallen
ist zwar nicht dein db Modell aber so kannste es bekommen:
SELECT a.name, b.message , c.send FROM User a, message b, msgsend c WHERE a.name = c.name AND a.name = b.name and c.send = '1' ORDER BY name
wobei send ein Bool ist und primary key = name
Beitrag zuletzt geändert: 7.6.2013 19:39:23 von n0tiert -
seth93 schrieb:
Wenn ich das richtig verstanden habe, müsstest du Benutzer und gesendet left joinen und dann gucken wo die Nachrichten.id NULL ist.
Meintest du das so?
SELECT * /* Nur für das Beispiel */ FROM `Nachrichten` LEFT JOIN `gesendet` ON (`gesendet`.`Nachricht`=`Nachrichten`.`Id`) LEFT JOIN `Benutzer` ON (`Benutzer`.`Benutzername`=`gesendet`.`Benutzer`) WHERE `Nachrichten`.`Id` IS NULL;
Daran hatte ich auch schon gedacht. Aber leider kommt dabei kein Ergebnis.
n0tiert schrieb:
ist zwar nicht dein db Modell aber so kannste es bekommen:
SELECT a.name, b.message , c.send FROM User a, message b, msgsend c WHERE a.name = c.name AND a.name = b.name and c.send = '1' ORDER BY name
wobei send ein Bool ist und primary key = name
Leider benötige ich gerade das genannte Model, da mich deine Struktur eingrenzen würde.
Beitrag zuletzt geändert: 10.6.2013 15:29:04 von fabi755 -
Ich habe nun selbst noch eine Lösung gefunden:
SELECT * /* Nur für das Beispiel */ FROM `Benutzer` WHERE `Benutzer`.`Benutzername` NOT IN ( SELECT `gesendet`.`Benutzer` FROM `gesendet` LEFT JOIN `Nachrichten` ON (`Nachrichten`.`Id`=`gesendet`.`Nachricht`) WHERE `Nachrichten`.`Id`='2' );
Ich habe es jetzt mit einem SubQuery gelöst, da es mir einfacher und sinnvoller erscheint. Ob es auch eine funktionierende Möglichkeit mit einem LEFT JOIN gibt weiß ich nicht.
Quelle: http://stackoverflow.com/questions/8776668/mysql-query-select-where-id-does-not-exist-in-the-join-table
n0tiert schrieb:
Deine Struktur sollste ja nicht verändern, und das sql sollte lediglich als ansatz dienen
dump mal deine "struktur" mit 2-3 dummy einträgen , und poste die mal, dann kann ich später mal nachsehen.
Um das ganze nochmal zu veranschaulichen habe ich das ganze noch mal als HTML-Datei vorbereitet:
http://fabi755.lima-city.de/sonstiges/forum/MySQL-nicht-vorhandene-JOINs/uebersicht.html
Beitrag zuletzt geändert: 10.6.2013 15:29:36 von fabi755 -
fabi755 schrieb:
Ich habe nun selbst noch eine Lösung gefunden:
SELECT * /* Nur für das Beispiel */ FROM `Benutzer` WHERE `Benutzer`.`Benutzername` NOT IN ( SELECT `gesendet`.`Benutzer` FROM `gesendet` LEFT JOIN `Nachrichten` ON (`Nachrichten`.`Id`=`gesendet`.`Nachricht`) WHERE `Nachrichten`.`Id`='2' );
Ich habe es jetzt mit einem SubQuery gelöst, da es mir einfacher und sinnvoller erscheint. Ob es auch eine funktionierende Möglichkeit mit einem LEFT JOIN gibt weiß ich nicht.
Quelle: http://stackoverflow.com/questions/8776668/mysql-query-select-where-id-does-not-exist-in-the-join-table
n0tiert schrieb:
Deine Struktur sollste ja nicht verändern, und das sql sollte lediglich als ansatz dienen
dump mal deine "struktur" mit 2-3 dummy einträgen , und poste die mal, dann kann ich später mal nachsehen.
Um das ganze nochmal zu veranschaulichen habe ich das ganze noch mal als HTML-Datei vorbereitet:
http://fabi755.lima-city.de/sonstiges/forum/MySQL-nicht-vorhandene-JOINs/uebersicht.html
so listest du aber nur die angegebene ID , und nicht wie gewollt alle nicht gesendete .....
bitte nextime ein sql struktur (ohne daten) dump, das ziel war die tables nicht manuell anlegen zu müssen
offene nachrichten haben keine id im feld benutzer (tbl gesendet)?
wie legst du die an ? lässt es ja garnicht zu mit "" für id
Beitrag zuletzt geändert: 10.6.2013 19:36:34 von n0tiert -
Was soll die Relation "gesendet" aussagen? Wer alles eine Nachricht bekommen hat, oder wer eine Nachricht gesendet hat?
SELECT * FROM Benutzer LEFT JOIN gesendet ON gesendet = Benutzer WHERE nachrichten_id IS NULL
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage