[mysql] Abfrage über zwei Tabellen

Loveboat

Erfahrenes Mitglied
Hallo zusammen,

ich sitze nun seit einigen Stunden vor einem Problem fest und komme nicht weiter.
Vielleicht ist jemand da draussen der mir die Augen öffnen kann. :)

Ich habe...

Tabelle 1: sliderPics (Beinhaltet die Information aller gespeicherten Bilder)
id
filename
title

Tabelle 2: sliderPicsGroup (Beinhaltet die Zuweisung einer Webseite mit zugewiesenen Bildern)
id
pageID
sliderID


Welche Spalten möchte ich?

Selektiere sliderPics.id, sliderPics.title


Welche Logik möchte ich für meine Webseite?

Gebe alle ID's und Titel von Tabelle 1 aus, welche noch NICHT in Tabelle 2 einer Webseite (pageID) zugewiesen wurde.


Einer meiner Versuche welcher teilweise gut ging:

Code:
SELECT `pics`.`id`, `pics`.`title`, `group`.`sliderID`
FROM `sliderPics` `pics`
LEFT JOIN `sliderPicsGroup` `group`
ON NOT `pics`.`id`=`group`.`sliderID` AND `group`.`pageID`='19'
HAVING NOT `group`.`sliderID` IS NULL

Ergebnis:
Wenn ein Bild einer Seite (Beispiel PageID = 19) zugewiesen wurde, erhalte ich alle nicht zugewiesene Bilder aus Tabelle 1.
Wenn aber noch KEIN Bild einer Seite zugewiesen wurde, ist das Ergebnis leer da der Wert für sliderID immer NULL ist und somit die HAVING-clause greift.

Wo ist mein Denkfehler?

Hoffe mein Problem wurde verstanden. :)
Bei Fragen => Melden!!

Danke schon mal im voraus.

Gruß
Loveboat
 
item: Having wird mit GROUP BY verwendet. Du brauchst aber kein GROUP BY. Da reicht ein WHERE aus.

item: Die 19 tut doch nix zur Sache wenn du alle pics haben willst die keiner Gruppe zugewiesen sind. Raus damit.

item: Selbst wenn die 19 richtig währe. Hat sie niemalsnie etwas im ON-Teil des Joins verloren. Vergleiche mit einem festen Wert gehören in den WHERE-Block. Im ON-Teil sind nur Tabellenverknüpfungen drin

SQL:
SELECT
	p.*
FROM
	sliderpics AS p
	LEFT JOIN sliderpicsgroup AS g
	ON p.id = g.sliderid
WHERE
	g.sliderid IS NULL
 
Zuletzt bearbeitet von einem Moderator:
Hallo Yaslaw,

danke für Deine Rückmeldung.

Leider erhalte ich nicht das gewünsche Ergebnis wenn ich Deinen SQl-Code verwende.
Mit Deinem Code erhalte ich nur die Bilder aus Tabelle 1 welche INSGESAMT in Tabelle 2 noch nicht zugewiesen wurde.

Was ist falsch?
In Tabelle 2 können die Bilder aus Tabelle 1 MEHRFACH/UNTERSCHIEDLICH vorkommen. Deshalb ist eine Verknüpfung zur pageID notwendig.

Was möchte ich?
Ich möchte alle Bilder aus Tabelle 1 welche noch NICHT einer Seite (pageID) in Tabelle 2 zugewiesen wurde.

Vielleicht macht es das jetzt klarer. :)

Danke und Gruß
Loveboat
 
Dann würde ich in meinem Query die Gruppe durch ein Subquery ersetzen welches auf die pageId filtert
SQL:
SELECT
    p.*
FROM
    sliderpics AS p
    LEFT JOIN (
        SELECT  sliderid
        FROM    sliderpicsgroup 
        WHERE   pageid = 19
    ) AS g
    ON p.id = g.sliderid
WHERE
    g.sliderid IS NULL
 
Zuletzt bearbeitet von einem Moderator:
Hi Yaslaw,

das ist Mist, es funktioniert. :)

Wenn Du mir jetzt Deine logischen Gedankengang mitteilen würdest warum Du es so gemacht hast dann könnte ich es verstehen und was lernen. :)

Danke und Gruß
Loveboat
 
Na gut, weil du es bist...

Mit dem folgenden Query ermittle ich alle sliderids der page 19
SQL:
        SELECT  sliderid
        FROM    sliderpicsgroup 
        WHERE   pageid = 19

Diese Menge knüpfe ich mit einem LEFT JOIN an die Tabelle sliderpics. Das bedeutet, ich abe dann alles von sliderpics und wenn per Zufalle in meinem Subquery einen Eintrag exisiteirt diese Info auch. Bei denjenigen die keine Gruppe in dem Subquery gefunden wurde, sind ei Felder des Subqueries NULL.
Ergo muss ich nur noch im WHERE abfragen welcher Eintrag bei der sliderid des Subqueries NULL enthält.

Zum verstehen, lass dir mal in phpmyadmin mein Query anzeigen ohne das letzte WHERE
 
Ah sorry, lass das folgende laufen, damit du auch die sliderid der Gruppe siest. Achte auf die letzte Spalte der Ausgabe
SQL:
SELECT
    p.*,
    -- Neu mit der sliderid der Page 19
    g.sliderid
FROM
    sliderpics AS p
    LEFT JOIN (
        SELECT  sliderid
        FROM    sliderpicsgroup 
        WHERE   pageid = 19
    ) AS g
    ON p.id = g.sliderid
 
Zuletzt bearbeitet von einem Moderator:
Ah, jetzt hab ich's.
Habe noch in der ersten Zeile beim SELECT ein g.* gemacht und nun bekomme ich eine schöne Tabelle angezeigt.

Eine Übersicht aller Bilder aus Tabelle 1 gefolgt von "sliderpicid", ob in Tabelle 2 gefunden und wenn nicht => NULL

DANKE YASLAW******

Gruß
 
Ja, hatte ich gesehen, ohne dem g.sliderid in dem ersten SELECT gibt er es mir ja nicht aus.

FUNKTIONIERT PRIMA!
 

Neue Beiträge

Zurück