[MySQL] IFNULL-Problem bei JOIN

Eagle-PsyX-

Erfahrenes Mitglied
Hi,

ich habe eine Tabelle `oa_content` die so aufgebaut ist:
## oa_content ##
ID,
Author,
Categorie,
SubCategorie,
Visibility

und eine Tabelle `oa_content__cat`
## oa_content__cat ##
cat_id,
cat_title

Nun will ich eine einen Bestimmten Inhalt aus oa_content mit beiden Kategorien. Dabei MUSS es eine Categorie geben, aber bei SubCategorie kann es auch 'NULL' sein.

SQL:
SELECT
 CON.*,
 CAT.*,
 USER.ID AS user_id,
 USER.User AS user_name,
 IFNULL(CON.SubCategorie,0) AS scat_id,
 IFNULL(CON.SubCategorie = CAT.cat_title,0) AS scat_title
FROM 
 `oa_content` AS CON,
 `oa_content__cat` AS CAT,
 `oa_user` AS USER
WHERE
 CON.`Visibility` = '1' AND
 CON.`Categorie` = CAT.cat_id AND
 CON.`Author` = USER.ID AND
 CON.`ID` = '1'

Mein Problem, wie kriege ich "cat_title" als "scat_title" zurück, falls eine SubCategorie besteht? Alles andere klappt perfekt, wenn keine SubCategorie da ist kriege ich 'scat_id' = 0 zurück, ebenso würde ich auch gern 'scat_title' = 0 haben.

EDIT:
So kriege ich zwar 3 Ergebnisse(?) dabei ist aber eins richtig, so dass falls vorhanden eine scat_title da steht und eine cat_title sowieso.
SQL:
SELECT
 CON.*,
 CAT.*,
 USER.ID AS user_id,
 USER.User AS user_name,
 IFNULL(CON.SubCategorie,0) AS scat_id,
 IF(CON.SubCategorie = CAT.cat_id,CAT.cat_title,0) AS scat_title
FROM 
 `oa_content` AS CON,
 `oa_content__cat` AS CAT,
 `oa_user` AS USER
WHERE
 CON.`Visibility` = '1' AND
 CON.`Author` = USER.ID AND
 CON.`ID` = '1'

Hat niemand eine Lösung dafür?
Wenn ich im Where-Bereich "CON.`SubCategorie` = CAT.cat_id" hinzufüge, hab ich mein Ergebnis, aber wenn dann keine SubCategorie mal NULL ist, hab ich überhaupt kein Ergebnis mehr!
 
Zuletzt bearbeitet von einem Moderator:
Hi,

bei der DB-Struktur müsstest Du die Kategorientabelle schon zweimal joinen, einmal mit Categorie = cat_id und einmal mit SubCategorie = cat_id, sonst kann das ja nichts werden.

LG
 
Hi,
also damit klappt es zwar, aber wenn keine SubCategorie vorhanden ist (NULL) dann kriege ich überhaupt kein Ergebnis zurück (was ja logisch ist anhand der letzten Where-Bedinungen).

Aber ohne diesen Where-Eintrag kriege ich 3 Ergebnisse zurück, wobei 2 davon identisch sind und nur "scat_title"= 0 liefern während eines davon stimmt.

SQL:
SELECT
 CON.*,
 CAT.*,
 USER.ID AS user_id,
 USER.User AS user_name,
 IFNULL(CON.SubCategorie,0) AS scat_id,
 IF(CON.SubCategorie = SCAT.cat_id, SCAT.cat_title, 0) AS scat_title
FROM 
 `oa_content` AS CON,
 `oa_content__cat` AS CAT,
 `oa_content__cat` AS SCAT,
 `oa_user` AS USER
WHERE
 CON.`Visibility` = '1' AND
 CON.`Author` = USER.ID AND
 CON.`ID` = '1' AND
 CON.`Categorie` = CAT.cat_id AND
 CON.`SubCategorie` = SCAT.cat_id

Das liefert mir beim einer vorhandenen SubCategorie EIN eindeutiges richtiges Ergebnis, ansonsten 3 identische Ergebnisse. (wohl für alle 3 Kategorien).

SQL:
 IF(ISNULL(CON.SubCategorie),0,CON.SubCategorie) = 
 IF(ISNULL(CON.SubCategorie),0,SCAT.cat_id)
 
Zuletzt bearbeitet von einem Moderator:
Könntest du mir es als Beispiel schreiben? Haut irgendwie nicht hin, falscher SQL-Syntax kommt bei mir raus^^.
 
Hi,

da könntest Du auch gerne mal das Manual bemühen oder folgenden Artikel:

Einführung in Joins

SQL:
SELECT * FROM tabelle1
   LEFT JOIN tabelle2
      ON tabelle1.key_field = tabelle2.key_field

Ich würde Dir allerdings empfehlen, diese komische Struktur zu ändern und in der Contenttabelle nur die ID der Kategorie zu speichern (ob Haupt- oder Unterkategorie). Wenn Du nur eine Unterebene hast, könntest Du ein Adjaceny List Model verwenden. Für komplexere Strukturen bieten sich Nested Sets an.

LG
 
Aber genau das habe ich doch getan.
In `Categorie` und `SubCategorie` wird jeweils die ID der Kategorie (oder Unterkategorie) gespeichert. In der Tabelle für die Kategorien steht nur:
cat_id; cat_title. Und das Problem ist dass nicht jeder Content eine Unter-Kategorie hat :-(
 
Hi,

Aber genau das habe ich doch getan.
In `Categorie` und `SubCategorie` wird jeweils die ID der Kategorie (oder Unterkategorie) gespeichert.

Genau das macht man so aber nicht. Speicher in der Contenttabelle nur die Kategorie, in der die Seite liegt, also quasi den parent oder Container. Dann brauchst Du nur noch eine Tabelle, in der Du die Struktur speicherst, im einfachsten Fall halt eine Adjacency List (id -> parent_id).
Such doch auch mal nach solchen Stichwörtern, das ist ja nun nicht das neueste Problem, da gibt's wirklich haufenweise Artikel zu.

LG
 
Zurück