Einfacher Join, steh auf dem Schlauch...

Einfacher Join, steh auf dem Schlauch...

am 30.10.2006 11:05:56 von Michael Pichler

Hallo zusammen,

ich glaub ich steh auf dem Schlauch und krieg den Join nicht hin:

Ich habe zwei Tabellen, eine für News-Einträge und eine für gelesene News:

News:
CREATE TABLE `news` (
`id` int(5) unsigned NOT NULL auto_increment,
`datum` date NOT NULL default '0000-00-00',
`ueberschrift_de` varchar(100) NOT NULL default '',
`ueberschrift_en` varchar(100) NOT NULL default '',
`news_de` text NOT NULL,
`news_en` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=18 ;


gelesene News:
CREATE TABLE `customer2News` (
`customerID` int(20) NOT NULL default '0',
`newsID` int(20) NOT NULL default '0',
`shop` varchar(35) NOT NULL default '',
PRIMARY KEY (`customerID`,`newsID`,`shop`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Ich brauch nun eine Abfrage, die mir die News-IDs ausgibt, die ein
Kunden eines Shops NICHT gelesen hat.

Ich dachte an:

select news.id
from news left join customer2News
on news.id = customer2News.newsID
where customer2News.customerID = '123' /* zum Beispiel */
and customer2News.shop = 'shop1' /* zum Beispiel */
and customer2News.newsID IS NULL

Aber irgendwie klappt das so nicht...
Wo hab ich da mein Brett vorm Hirn?

Danke!

Gruß
Michael

Re: Einfacher Join, steh auf dem Schlauch...

am 30.10.2006 13:03:34 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: Einfacher Join, steh auf dem Schlauch...

am 30.10.2006 13:51:31 von Claus Reibenstein

Michael Pichler schrieb:

> Ich brauch nun eine Abfrage, die mir die News-IDs ausgibt, die ein
> Kunden eines Shops NICHT gelesen hat.
>
> Ich dachte an:
>
> select news.id
> from news left join customer2News
> on news.id = customer2News.newsID
> where customer2News.customerID = '123' /* zum Beispiel */
> and customer2News.shop = 'shop1' /* zum Beispiel */
> and customer2News.newsID IS NULL

So sollte es funktionieren (ungetestet):

SELECT news.id FROM news
LEFT JOIN customer2News
ON news.id = customer2News.newsID
AND customer2News.customerID = '123'
AND customer2News.shop = 'shop1'
WHERE customer2News.newsID IS NULL

Gruß. Claus

Re: Einfacher Join, steh auf dem Schlauch...

am 30.10.2006 14:14:27 von Michael Pichler

Andreas Kretschmer schrieb:
>> Aber irgendwie klappt das so nicht...
>> Wo hab ich da mein Brett vorm Hirn?
>
> Ich würde dies mit EXCEPT machen, weiß aber nicht, ob Deine
> MySQL-Version dies unterstützt.
>
> Lesetipp: http://www.varlena.com/varlena/GeneralBits/56.php

Hallo Andreas,

ich wusste nicht, dass es überhaupt MySql Versionen gibt, die mit Except
was anfangen können.
Hab 4.1.10 am Laufen, da ist except leider nicht im Sprachschatz meines
MySQL Servers.

Ich hätte es sonst auch mit einem Subselect und "NOT EXISTS" gemacht,
aber dafür ist die Version auch zu alt.

Hab es inzwischen im Programm mit 2 Selects gelöst, klappt auch :)

Trotzdem danke!

Gruß
Michael

Re: Einfacher Join, steh auf dem Schlauch...

am 30.10.2006 19:35:15 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: Einfacher Join, steh auf dem Schlauch...

am 30.10.2006 20:09:51 von Gregor Kofler

Michael Pichler meinte:

> Ich hätte es sonst auch mit einem Subselect und "NOT EXISTS" gemacht,
> aber dafür ist die Version auch zu alt.

4.1 beherrscht Subqueries der Form

select ... from ... where ... in|not in (select ...)



Gruß, Gregor


--
http://www.gregorkofler.at ::: Landschafts- und Reisefotografie
http://www.licht-blick.at ::: Forum für Multivisionsvorträge
http://www.image2d.com ::: Bildagentur für den alpinen Raum