ch08: Hilfe bei Abfrage MySQL

Hallo Community,

ich habe ein Problem bei einer MySQL abfrage, eventuell kann mir jemand weiterhelfen ich habe sämtliche Kombinationen probiert bekomme aber nicht das gewünschte Ergebnis.

Ich habe folgende Tabellen in der Datenbank:

Tabelle "articles":

articleID (INT-11, PRIMARY, auto_inc),
articleContent (LONGTEXT),
articleAuthor (INT-11)

Tabelle "users":

userID (INT-11, PRIMARY, auto_inc),
userAlias (VARCHAR-255),

Tabelle "elements":

In dieser Tabelle werden Gruppen, Menüs und Kategorien gespeichert.
Um was es sich handelt ist in der Spalte "elementType" festgelegt.

elementID (INT-11, PRIMARY, auto_inc),
elementType (ENUM),
elementName (VARCHAR255)

Tabelle "relation":

Diese Tabelle soll die Elemente aus der Tabelle "elements" verbinden.
Zum Beispiel kann eine User aus der Tabelle "users" mit einer Gruppe aus der Tabelle "elements" verbunden werden. Was mit dem Element verknüpft wird ist in der Spalte "relationType" festgelegt.

relationID (INT-11, PRIMARY, auto_inc),
elementID (INT-11),
relationType (ENUM)
relationLink (INT-11)

Nun habe ich folgende Abfrage:

SELECT  
	a.articleID,  
	a.articleContent,  
	  
	b.userAlias AS articleAuthor,  
	  
	d.elementName AS articleCategory  
	  
FROM articles AS a  
  
INNER JOIN user AS b  
	ON (a.articleAuthor = b.userID)  
	  
LEFT JOIN relation AS c  
	ON (a.articleID = c.relationLink)  
	  
LEFT JOIN elements AS d  
	ON (c.elementID = d.elementID)  
	  
WHERE (c.relationType = 'article')  
	AND (d.elementType = 'category')  
	AND (a.articleID = '1')

Es wäre möglich das ein Artikel mit einer Kategorie verbunden ist dies muss aber nicht sein und genau da liegt das Problem. Bis zum "INNER JOIN" funktioniert alles. Nur die beiden "LEFT JOINS" funktionieren natürlich nicht. Ich habe aber leider keine Lösung gefunden.

Kann mir jemand helfen das zum "Laufen" zu bekommen?

Liebe Grüße,
Markus

  1. Ohne jetzt mich reingedacht zu haben, aber du schränkst ja über das WHERE die kategorie ein, wenn diese natürlich NULL ist matched dein WHERE nicht, dann müsstest du noch sagen
    OR category IS NULL

    1. Ohne jetzt mich reingedacht zu haben, aber du schränkst ja über das WHERE die kategorie ein, wenn diese natürlich NULL ist matched dein WHERE nicht, dann müsstest du noch sagen
      OR category IS NULL

      Die Kategorie steht gar nicht unter "WHERE". Die Kategorie soll mit abgefragt werden.

    2. Auch so funktioniert es leider nicht:

        
      SELECT  
      	a.articleID,  
      	a.articleTextFull,  
      	  
      	b.userAlias AS articleAuthor,  
      	  
      	d.elementName AS articleCategory  
      	  
      FROM articles AS a  
        
      INNER JOIN user AS b  
      	ON (a.articleAuthor = b.userID)  
      	  
      LEFT JOIN relation AS c  
      	ON (a.articleID = c.relationLink)  
      	  
      LEFT JOIN elements AS d  
      	ON (c.elementID = d.elementID)  
      	  
      WHERE ((c.relationType = 'article') OR (c.relationType IS NULL))  
      	AND ((d.elementType = 'category') OR (d.elementType IS NULL))  
      	AND (a.articleID = '2')
      
  2. Hi,

    LEFT JOIN relation AS c

    ON (a.articleID = c.relationLink)

    LEFT JOIN elements AS d
    ON (c.elementID = d.elementID)

    WHERE (c.relationType = 'article')
    AND (d.elementType = 'category')
    AND (a.articleID = '1')

      
    Das (c.relationType = 'article') bzw. das (d.elementType = 'category') ist m.E. Teil der Join-Bedinung, nicht Teil der Datensatzauswahl.  
      
    Also eher so:  
    ~~~sql
    LEFT JOIN relation AS c  
    	ON ((a.articleID = c.relationLink) AND (c.relationType = 'article'))  
    	  
    LEFT JOIN elements AS d  
    	ON ((c.elementID = d.elementID) AND (d.elementType = 'category'))  
    	  
    WHERE (a.articleID = '1')
    

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
    1. Das wars! Danke!