Drei Tabellen - ein Problem...
Moin,
durch die Umstellung auf MySQL 5 (von Version 4) scheint irgendwas mit
den Joins wohl anders zu laufen. Da ich nicht der SQL-Crack bin, stehe
ich vor einem trivialen Problem, aber krieg es nicht mehr hin:
Drei Tabellen:
Nutzer (user: userID, ... andere Daten)
nachrichten (message: messageID,... andere Daten)
Nun werden Nachrichten an die Nutzer verschickt. Da keine Nachricht
doppelt versicht werden soll, gibt es eine klassische n:m Relation
user_message
Mein (gedachtes) Ziel ist es eigentlich, eine Abfrage zu kreieren,
welche mir anzeigt, welche Nutzer z.B. Nachricht 4 nicht zugeschickt
bekommen haben. Ich dachte mir, ein paar Joins und das wars,.... wohl
nicht per MySQL 5. Da ist was anders oder ich weiss nichts mehr...
Mein Ziel wäre eine Tabelle in der Form
messageID userID sumreceived
4 1 0
4 2 1
4 3 0
4 4 1
4 5 1
usw.
natürlich filtere ich dann nach sumreceived=3D0 und weiteren
Eigenschaften, z.B. der usertabelle...
Aber im Moment ein Blockade oder MySQL5 hat etwas geändert, was ich
nicht kenne.
Danke für jedwede Hilfe...
Gruß
Frank B.
--
"Unterwerfung ist die einzige bequeme Antwort auf Autorität"
Re: Drei Tabellen - ein Problem...
Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)
Re: Drei Tabellen - ein Problem...
Andreas Kretschmer wrote:
> begin Frank Burmeister wrote:
>> Moin,
>
>> durch die Umstellung auf MySQL 5 (von Version 4) scheint irgendwas mit=
>> den Joins wohl anders zu laufen. Da ich nicht der SQL-Crack bin, stehe=
>
> Unwahrscheinlich. Möglicherweise hattest Du lediglich bisher etwas
> verwendet, was nach SQL-Spec flasch war und das geht nun vielleicht
> nicht mehr.
Ehrlich gesagt, verwende ich jetzt schlicht zwei Abfragen nacheinander.
Muss ja voran gehen... Mit einer Abfrage jedenfalls schaffe ich es im
Moment nicht zu erschlagen.
> Wie hast Du es denn bisher gemacht, was hast Du nun gemacht und wie
> lautet die Fehlermeldung?
Fehlermeldung ist gut: Ich bekomme einfach nicht das, was ich mir
wünsche und irgendwie habe ich mich verrannt und bin auf obige Lösung=
ausgewichen die da lautet:
1.Gebe mir alle Nutzer
2.Sage mir welche Nutzer nicht Mail XYZ haben.
Das erschlägt man mit einem Select und noch einem mit einem laaaaangen =
NOT IN (,,,,)...
Wenn du vielleicht *eine* Lösung hättest? Wäre klasse... Ich bin he=
ute
nicht mehr dazu in der Lage...
Danke und Gruß
Frank B.
--
"Unterwerfung ist die einzige bequeme Antwort auf Autorität"
Re: Drei Tabellen - ein Problem...
Frank Burmeister wrote:
> Fehlermeldung ist gut: Ich bekomme einfach nicht das, was ich mir
> wünsche und irgendwie habe ich mich verrannt und bin auf obige Lösung
> ausgewichen die da lautet:
>
> 1.Gebe mir alle Nutzer
> 2.Sage mir welche Nutzer nicht Mail XYZ haben.
>
> Das erschlägt man mit einem Select und noch einem mit einem laaaaangen
> NOT IN (,,,,)...
>
> Wenn du vielleicht *eine* Lösung hättest? Wäre klasse... Ich bin heute
> nicht mehr dazu in der Lage...
Bei [NOT] IN kann man statt einer hard-codierten Liste auch einfach ein
SELECT nehmen, nennt sich dann Subquery - allzugroße SQL Kenntnisse hast
du aber bis jetzt nicht :-)
select *
from user as u
where userid no in
(
select userid
from user_message
where message_id = 4
)
oder:
select *
from user as u
where not exists
(select * from user_message as um
where u.userid = um.userid
and um.messageid = 4
)
oder, wenn du's unbedingt mit einem Join machen willst:
select *
from user as u left join user_message as um
on u.userid = um.userid and um.messageid = 4
where um.userid is null
oder genau für deine ursprüngliche Zieltabelle:
select
u.messageid
,u.userid
,case when um.userid is null then 0 else 1 end as sumreceived
from user as u left join user_message as um
on u.userid = um.userid and um.messageid = 4
Oh, das war jetzt aber nicht *eine* Lösung, sorry...
Dieter
Re: Drei Tabellen - ein Problem...
Moin Dieter,
> Bei [NOT] IN kann man statt einer hard-codierten Liste auch einfach ein=
> SELECT nehmen, nennt sich dann Subquery - allzugroße SQL Kenntnisse h=
ast
> du aber bis jetzt nicht :-)
Meine erste Berührung mit MySQL war in Version 3 zusammen mit PHP.
Damals(TM) hieß es immer, dass MySQL keine SubSelects konnte und man
hat sich mit vielem beholfen.
Ich weiss mein Server hat mittlerweile MySQL 5, aber auch nur, weil die
entsprechende Linux Distribution mir das aufspielte, einen richtigen
Grund habe ich nie gehabt. Kurzum: Nicht jede sinnvolle Entwicklung
habe ich so mitgemacht, habe mit Anwendungsprogrammieren auch genug
andere Sorgen, da darf man mal ein Brett vorm Kopf haben.
Aber dafür: Erstmal vielen Dank. Aber deine letzte Lösung geht schon =
viel zu weit. Ich denke, ich erkläre das Jahr 2008 mal zum SQL Jahr und=
bilde mich mal weiter.
Danke und Gruß
Frank B.
--
"Unterwerfung ist die einzige bequeme Antwort auf Autorität"