Hilfe bei Select Abfrage
am 26.09.2006 16:03:55 von xylux
Hallo,
ich komme bei folgender Abfrage nicht weiter:
MySQl 5.0
presseartikel
------------------------
id int(11)
headline varchar(100)
artikeltxt longtext
themen_schl
------------------
id_t_s int(11)
id_artikel int(11)
id_themen int(11)
themen
--------------------------------------
ind_themen int(11)
bezeichnung varchar(100)
SELECT
GROUP_CONCAT(DISTINCT themen.bezeichnung ORDER BY bez SEPARATOR ', ') AS
bezeichnung,
headline,artikeltxt FROM presseartikel
INNER JOIN themen_schl A ON presseartikel.id = A.id_artikel
INNER JOIN themen_schl B ON presseartikel.id = B.id_artikel
LEFT JOIN themen ON (A.id_themen=ind_themen)
WHERE
A.id_themen=6
AND B.id_themen=45
GROUP BY presseartikel.id
------------------------------------------------------------ ------------------------
Das Feld Bezeichnung
'(GROUP_CONCAT... AS bezeichnung)',
soll eine Liste aller Themen zu jedem Presseartikel liefern.
Ich bekomme bei dieser Abfrage aber immer nur das Thema gelistet, nachdem gesucht wurde.
Also im obigen Beispiel die Themen, die über die Where-Bedingung gefiltert werden.
Jedem Artikel sind allerdings weitere Themen zugeordnet.
(Ich habe die eigentliche Abfrage auf das Wesentliche reduziert)
Was muss ich ändern, damit alle Themen zum jeweiligen Artikel ausgegeben werden? /
Geht das mit einer Abfrage überhaupt?
Ich hoffe, ich habe mich einigermaßen verständlich ausdrücken können und jemand hier kann mir helfen.
Danke und Gruß
Hans
Re: Hilfe bei Select Abfrage
am 26.09.2006 21:30:08 von Dominik Echterbruch
H.Armgart wrote:
> Hallo,
> ich komme bei folgender Abfrage nicht weiter:
>
>
> MySQl 5.0
>
> presseartikel
> ------------------------
> id int(11)
> headline varchar(100)
> artikeltxt longtext
>
>
> themen_schl
> ------------------
> id_t_s int(11)
> id_artikel int(11)
> id_themen int(11)
>
>
>
> themen
> --------------------------------------
> ind_themen int(11)
> bezeichnung varchar(100)
[snip]
> Was muss ich ändern, damit alle Themen zum jeweiligen Artikel ausgegeben
> werden? /
> Geht das mit einer Abfrage überhaupt?
Ohne mir das jetzt gneau angeschaut zu haben und zwischen Tür und Angel.
Wenn du im WHERE auf nur ein Thema einschränkst, aber alle haben willst,
muß du im Prinzip folgendes tun:
- Alle Artikel selektieren, für die ein bestimmtes Thema eingetragen ist
- Dieses Ergebnis mit den Themen über die Artikel-ID JOINen
Also erst mal von den Themen auf die Artikel und dann nochmal anders rum
auf die Themen joinen.
Ich hoffe, das hilft als Anregung.
Grüße,
Dominik
--
http://www.vlights.com/
vLights.com - Das Portal für virtuelle Kerzen
Re: Hilfe bei Select Abfrage
am 27.09.2006 07:36:48 von xylux
"Dominik Echterbruch" schrieb
> Also erst mal von den Themen auf die Artikel und dann nochmal anders rum auf die Themen joinen.
> Ich hoffe, das hilft als Anregung.
Im Prinzip kann ich das nachvollziehen. Ich habe zurzeit allerdings keine Idee, wie ich das praktisch umsetzen kann.
Kannst du mir mal mit einem Codeschnipsel auf die Sprünge helfen?
Gruß
Hans
Re: Hilfe bei Select Abfrage
am 27.09.2006 22:20:16 von Dominik Echterbruch
H.Armgart wrote:
>
>> Also erst mal von den Themen auf die Artikel und dann nochmal anders
>> rum auf die Themen joinen.
>> Ich hoffe, das hilft als Anregung.
>
> Im Prinzip kann ich das nachvollziehen. Ich habe zurzeit allerdings
> keine Idee, wie ich das praktisch umsetzen kann.
>
> Kannst du mir mal mit einem Codeschnipsel auf die Sprünge helfen?
Da du ja schon JOINs verwendet hast, bin ich davon ausgegangen, daß du
darin einigermaßen fit bist. Nach einem zweiten Blick auf deinen Ansatz
habe ich meine Meinung etwas korrigiert. Ist nicht böse gemeint, jeder
fängt ja mal klein an.
Hier also die Abfrage, die ich machen würde mit einigen Kommentaren
für's Verständnis:
-- Die gewuenschten Spalten; der DISTINCT ist ueberfluessig, da ohnehin
-- alle Themen nur einmal geliefert werden (durch den INNER JOIN)
SELECT GROUP_CONCAT(t.bezeichnung ORDER BY bez SEPARATOR ', ') AS
bezeichnung, a.headline, a.artikeltxt
-- Die Themen sind das eigentlich einschraenkende Kriterium
FROM themen_schl ts1
-- Und dazu gibt es dann mindestens einen Artikel geben
INNER JOIN presseartikel a ON a1.id = ts1.id_artikel
-- Zu dem kann es dann aber wieder mehrere Themen geben (mindestens
-- eins, denn darauf hast du ja im WHERE gefiltert
INNER JOIN themen_schl ts2 ON ts2.id_artikel = a.id
-- Und die passenden Beschreibungen fuer den GROUP_CONCAT
INNER JOIN themen t ON t.id_themen = ts2.id_themen
-- Die Themen, zu denen du Artikel haben moechtest
WHERE ts1.id_themen = 6
Also in Kurzform: Erst mal schauen, welche Artikel es für die Themen
gibt (in diesem Fall wird alles gefunden, das Thema 6 hat; wenn du nur
Artikel haben möchtest, die sowohl zum Thema 6, als auch zum Thema 45
gehören, mußt du das noch etwas umbauen; das überlasse ich dir aber mal
zur Übung).
Anschließend dann das Pferd von hinten aufzäumen und alle Themen suchen,
die mit den gefundenen Artikeln verknüpft sind.
Ich hoffe, das bringt dich weiter.
Grüße,
Dominik
--
http://www.vlights.com/
vLights.com - Das Portal für virtuelle Kerzen
Re: Hilfe bei Select Abfrage
am 28.09.2006 19:08:49 von xylux
"Dominik Echterbruch" schrieb
> jeder fängt ja mal klein an.
Das siehst du ganz richtig. Learning by doing.
Ich hatte bisher alles immer über die where-Bedingung verknüpft.
Danke dir auch für die Kommentierungen.
> wenn du nur Artikel haben möchtest, die sowohl zum Thema 6, als auch zum Thema 45 gehören, mußt du das noch etwas umbauen; das
> überlasse ich dir aber mal zur Übung).
Habe schon mal 2 Std. 'geübt', nachgeschlagen und bin auf selfjoin (?)
gestoßen - allerdings ohne Erfolgserlebnis..;-)
Grüße
Hans
Re: Hilfe bei Select Abfrage
am 28.09.2006 21:09:29 von Dominik Echterbruch
H.Armgart wrote:
>
>> wenn du nur Artikel haben möchtest, die sowohl zum Thema 6, als auch
>> zum Thema 45 gehören, mußt du das noch etwas umbauen; das
>> überlasse ich dir aber mal zur Übung).
>
> Habe schon mal 2 Std. 'geübt', nachgeschlagen und bin auf selfjoin (?)
> gestoßen - allerdings ohne Erfolgserlebnis..;-)
Self-Join ist in diesem Zusammenhang auch nicht richtig. Du mußt zwar
mehrfach mit themen_schl joinen, aber nie mit sich selbst, sondern immer
mit artikel bzw. themen. Ungefähr so:
SELECT GROUP_CONCAT(t.bezeichnung ORDER BY bez SEPARATOR ', ') AS
bezeichnung, a.headline, a.artikeltxt
INNER JOIN presseartikel a ON a.id = ts1.id_artikel
INNER JOIN themen_schl ts1 ON ts1.id_artikel = a.id
INNER JOIN themen_schl ts2 ON ts2.id_artikel = a.id
INNER JOIN themen_schl ts3 ON ts3.id_artikel = a.id
INNER JOIN themen t ON t.id_themen = ts3.id_themen
WHERE ts1.id_themen = 6 AN ts2.id_themen = 45
Nicht wundern: Damit es gleichförmig aussieht, habe ich ts1 und a im
Vergleich zur letzten Version einfach mal vertauscht.
ts1 und ts2 dienen jetzt zur Einschränkung der Themen. ts3 holt dann für
die anschließend verbliebenen Artikel alle verfügbaren Themen.
Grüße,
Dominik
--
http://www.vlights.com/
vLights.com - Das Portal für virtuelle Kerzen
Re: Hilfe bei Select Abfrage
am 30.09.2006 07:06:03 von xylux
"Dominik Echterbruch" schrieb
> Self-Join ist in diesem Zusammenhang auch nicht richtig. Du mußt zwar mehrfach mit themen_schl joinen, aber nie mit sich selbst,
> sondern immer mit artikel bzw. themen.
Ok, werde ich so probieren.
Komme allerdings erst nächste Woche dazu.
>Ungefähr so:
> SELECT GROUP_CONCAT(t.bezeichnung ORDER BY bez SEPARATOR ', ') AS
....
Sieht logisch aus, wenn ich es mir jetzt ansehe.
Noch 'ne Verständnisfrage hierzu:
>INNER JOIN themen_schl ts1 ON ts1.id_artikel = a.id
>INNER JOIN themen_schl ts2 ON ts2.id_artikel = a.id
ergeben 2 Mengen/Listen ts1 + ts2
die dann mit
> WHERE ts1.id_themen = 6
AND ts2.id_themen = 45
jeweils einschränkt und dann verknüpft werden ?
(Ich muss mir das irgendwie vorstellen können, was da passiert ;-)
Gruß Hans