DISTINCT übermehre Tabellen?

DISTINCT übermehre Tabellen?

am 11.09.2006 00:18:26 von newsonly2

Hallo NG,

ich habe Problem mit einer SELECT DISTINCT Abfrage über 2 Tabellen deren
Ergebnis nicht distinct zu sein scheint.

Tabelle 1: themen
ThemaID
ThemaBildID

Tabelle 2: artikel
ArtikelID
ThemaID (Ordnet die Artikel den Themen zu)
ArtikelBildID

Gewünschtes Ergebnis:
Alle ThemaIDs exakt 1x die entweder direkt das gesuchte Bild enthalten
oder bei denen es in einem Artikel zum Thema vorkommt und sagen zu
können: Bild kommt bei folgenden Themen vor: ...
Anmerkung: ThemaBilder kommen nicht immer in den zugehörigen Artikeln
vor, umgekehrt genauso.

Meine Abfrage:
SELECT DISTINCT artikel.ThemaID, thema.ThemaID FROM
artikel, themen WHERE themen.ThemenBildID = '$BildID' OR
artikel.ArtikelBildID = '$BildID' AND Themen.ThemenID =
artikel.ArtikelID

Problem:
Bei einer BildID die nur 1x als ThemaBildID verwendet wurde bekomme ich
trotz DISTINCT 4x die ThemaID zurück und komme nicht dahinter warum.

Frage: Was mache ich flscha bzw wie bekomme ich es hin, dass jede
ThemaID nur 1x vorkommt?

Gruss,
Olly

Re: DISTINCT über mehre Tabellen?

am 11.09.2006 02:47:42 von Johannes Vogel

Hi Oliver

Oliver C. Thornton wrote:
> Meine Abfrage:
> SELECT DISTINCT artikel.ThemaID, thema.ThemaID FROM
> artikel, themen WHERE themen.ThemenBildID = '$BildID' OR
> artikel.ArtikelBildID = '$BildID' AND Themen.ThemenID =
> artikel.ArtikelID

Parse Error: Du machst ziemlich viel bzgl. thema / Themen falsch. Wie
heisst nun die Tabelle?

> Problem:
> Bei einer BildID die nur 1x als ThemaBildID verwendet wurde bekomme ich
> trotz DISTINCT 4x die ThemaID zurück und komme nicht dahinter warum.
> Frage: Was mache ich flscha bzw wie bekomme ich es hin, dass jede
> ThemaID nur 1x vorkommt?

Mal etwas rumgeschraubt:
select distinct a.themaid, t.themaid
from Artikel a join Themen t using (themaid)
where t.bildid = $bildID or a.bildid = $bildID;

Das ist ebenfalls sinnlos, weil a.themaid und t.themaid gemäss join
condition sowieso gleich sein muss. Also:
select distinct a.themaid
from Artikel a join Themen t using (themaid)
where t.bildid = $bildID or a.bildid = $bildID;

Jetzt stellt sich die Frage, was die Bild-IDs von Artikel und Themen
gemeinsam haben. Wieso hast du hier dieselbe Variable $bildid für zwei
unterschiedliche Inhalte?

Weshalb also nicht gleich:
select themaid from Artikel where bildid=$artikelbild;
select themaid from Themen where bildid=$themenbild;

Abschliessend - denn jetzt mag ich nicht mehr - empfehle ich dir die
Lektüre, einen Lehrgang, etc. zum Datenbankdesign und gerade auch etwas
sorgfältigere Konzeption beim Applikationsbau.

HTH, Johannes

Re: DISTINCT übermehre Tabellen?

am 11.09.2006 04:27:04 von newsonly2

Di dalam de.comp.datenbanken.mysql Johannes Vogel menulis sebagai
berikut:

Hi Johannes,

> > SELECT DISTINCT artikel.ThemaID, thema.ThemaID FROM
> > artikel, themen WHERE themen.ThemenBildID = '$BildID' OR
> > artikel.ArtikelBildID = '$BildID' AND Themen.ThemenID =
> > artikel.ArtikelID
>
> Parse Error: Du machst ziemlich viel bzgl. thema / Themen falsch. Wie
> heisst nun die Tabelle?

Ich habe die Namen nur benutzt um das hier zu verdeutlichen, in der
Abfrage stimmen Sie, sind aber dem Verständnis nicht zuträglich :)

> select distinct a.themaid, t.themaid
> from Artikel a join Themen t using (themaid)
> where t.bildid = $bildID or a.bildid = $bildID;

JOIN USING... Das hab ich gesucht :) Nun bekomme ich auch keine
doppelten Ergebnisse mehr.
Allerdings fehlen jetzt auch Ergebnisse:
Fehlerfall: Es existiert ein Thema mit Bild, allerdings sind diesem
Thema keine Artikel zugeordnet.

> Das ist ebenfalls sinnlos, weil a.themaid und t.themaid gemäss join
> condition sowieso gleich sein muss. Also:
> select distinct a.themaid
> from Artikel a join Themen t using (themaid)
> where t.bildid = $bildID or a.bildid = $bildID;

Das ist kürzer, aber der o.g. Fehlerfall bleibt leider.

> Jetzt stellt sich die Frage, was die Bild-IDs von Artikel und Themen
> gemeinsam haben. Wieso hast du hier dieselbe Variable $bildid für
> zwei unterschiedliche Inhalte?

$BildID habe ich wenn ich auf ein Bild klicke (picinfo.php?BildID= ).
Dann kommt eine Seite mit Informationen zum Bild. Dort möchte ich auch
Unterbringen in welchen Themen das Bild verwendet wurde.
Das klappt soweit wenn in den Artikeln das Bild vorkommt oder das Thema
selber das Bild mit der BildID enthält, aber nur wenn das Thema auch
zugehörige Artikel hat. Sofern zwar ein Thema mit dem Bild existiert
allerdings dieses keine Artikel enthält fehlt es im Ergebnis.

> Weshalb also nicht gleich:
> select themaid from Artikel where bildid=$artikelbild;
Dann würden die Bilder die in einem Thema aber nicht in dessen Artikeln
verwendet wurden fehlen.

> select themaid from Themen where bildid=$themenbild;
Dann würden nur Themen gelistet die das Bild direkt enthalten, nicht
jedoch wenn das Bild nur in Artikeln zum Thema vorkommt.

Wenn es so einfach wäre hätte ich das selber hinbekommen :)
Ich suche im Prinzip eine Methode deine beiden letzten (einfachen)
Vorschläge so zu verknüpfen, dass keine doppelten Werte vorkommen (Falls
ein Thema und ein Artikel zum selben das selbe Bild benutzen).
>
> Abschliessend - denn jetzt mag ich nicht mehr - empfehle ich dir die
> Lektüre, einen Lehrgang, etc. zum Datenbankdesign und gerade auch
> etwas sorgfältigere Konzeption beim Applikationsbau.

Ich bin Zivilist was das angeht, also sei bitte nicht so streng mit mir
:)

Ich danke schonmal bis hierher,
Olly

Re: DISTINCT übermehre Tabellen?

am 11.09.2006 10:52:10 von Thomas Rachel

Johannes Vogel wrote:

> Das ist ebenfalls sinnlos, weil a.themaid und t.themaid gemäss join
> condition sowieso gleich sein muss. Also:
> select distinct a.themaid
> from Artikel a join Themen t using (themaid)
> where t.bildid = $bildID or a.bildid = $bildID;

Unter der Annahme, daß es auch "leere" Themen geben kann, denen also ein
Bild, aber (noch) keine Artikel zugeordnet sind:

select distinct t.themaid
from Themen t left join Artikel a using (themaid)
where t.bildid = $bildID or a.bildid = $bildID;

Thomas
--
»Herr Schaffner, ist das mein Zug?«
»Nein, der gehört der DB Reise&Touristik GmbH«

Solved: DISTINCT übermehre Tabellen?

am 11.09.2006 13:38:30 von newsonly2

Di dalam de.comp.datenbanken.mysql Thomas Rachel menulis sebagai
berikut:

Hi Thomas,

> Unter der Annahme, daß es auch "leere" Themen geben kann, denen
> also ein Bild, aber (noch) keine Artikel zugeordnet sind:

Genau der beschriebene Fehlerfall für meine Abfragen und die Abfragen
die Johannes vorgeschlagen hat.

> select distinct t.themaid
> from Themen t left join Artikel a using (themaid)
> where t.bildid = $bildID or a.bildid = $bildID;

Passt perfekt! Liefert genau was ich suche.
(Und ich hab sogar verstanden warum! :))

Vielen Dank und Gruß,
Olly

Re: DISTINCT über mehre Tabellen?

am 11.09.2006 22:56:17 von dnoeth

Oliver C. Thornton wrote:

>> select themaid from Artikel where bildid=$artikelbild;
....
>> select themaid from Themen where bildid=$themenbild;
....
> Ich suche im Prinzip eine Methode deine beiden letzten (einfachen)
> Vorschläge so zu verknüpfen, dass keine doppelten Werte vorkommen (Falls
> ein Thema und ein Artikel zum selben das selbe Bild benutzen).

SQL ist mengenorientiert, da gibt es z.B. Schnittmengen (INTERSECT),
Differenzmengen (EXCEPT) und Vereinigungsmengen (UNION) und bei den
Mengenoperatoren ist der Default ein DISTINCT...

War der Zaunpfahl groß genug?

Dieter