Drei Tabellen - ein Problem...

Drei Tabellen - ein Problem...

am 12.01.2008 14:50:39 von Rainer Hinz

Moin,

durch die Umstellung auf MySQL 5 (von Version 4) scheint irgendwas mit=20
den Joins wohl anders zu laufen. Da ich nicht der SQL-Crack bin, stehe=20
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=20
doppelt versicht werden soll, gibt es eine klassische n:m Relation

user_message

Mein (gedachtes) Ziel ist es eigentlich, eine Abfrage zu kreieren,=20
welche mir anzeigt, welche Nutzer z.B. Nachricht 4 nicht zugeschickt=20
bekommen haben. Ich dachte mir, ein paar Joins und das wars,.... wohl=20
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=20
Eigenschaften, z.B. der usertabelle...

Aber im Moment ein Blockade oder MySQL5 hat etwas geändert, was ich=20
nicht kenne.

Danke für jedwede Hilfe...

Gruß
Frank B.




--=20
"Unterwerfung ist die einzige bequeme Antwort auf Autorität"

Re: Drei Tabellen - ein Problem...

am 12.01.2008 16:44:27 von Andreas Kretschmer

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...

am 12.01.2008 20:32:16 von Rainer Hinz

Andreas Kretschmer wrote:
> begin Frank Burmeister wrote:
>> Moin,
>=20
>> durch die Umstellung auf MySQL 5 (von Version 4) scheint irgendwas mit=
=20
>> den Joins wohl anders zu laufen. Da ich nicht der SQL-Crack bin, stehe=
=20
>=20
> 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.=20
Muss ja voran gehen... Mit einer Abfrage jedenfalls schaffe ich es im=20
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=20
wünsche und irgendwie habe ich mich verrannt und bin auf obige Lösung=
=20
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=20
nicht mehr dazu in der Lage...

Danke und Gruß
Frank B.

--=20
"Unterwerfung ist die einzige bequeme Antwort auf Autorität"

Re: Drei Tabellen - ein Problem...

am 12.01.2008 20:55:48 von dnoeth

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...

am 12.01.2008 23:12:49 von Rainer Hinz

Moin Dieter,

> Bei [NOT] IN kann man statt einer hard-codierten Liste auch einfach ein=
=20
> SELECT nehmen, nennt sich dann Subquery - allzugroße SQL Kenntnisse h=
ast=20
> du aber bis jetzt nicht :-)

Meine erste Berührung mit MySQL war in Version 3 zusammen mit PHP.=20
Damals(TM) hieß es immer, dass MySQL keine SubSelects konnte und man=20
hat sich mit vielem beholfen.
Ich weiss mein Server hat mittlerweile MySQL 5, aber auch nur, weil die=20
entsprechende Linux Distribution mir das aufspielte, einen richtigen=20
Grund habe ich nie gehabt. Kurzum: Nicht jede sinnvolle Entwicklung=20
habe ich so mitgemacht, habe mit Anwendungsprogrammieren auch genug=20
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=
=20
bilde mich mal weiter.

Danke und Gruß
Frank B.

--=20
"Unterwerfung ist die einzige bequeme Antwort auf Autorität"