Announcement

Collapse
No announcement yet.

MYSQ- Problem bei Abfrage über 2 Tabellen mit If und IFNULL

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • MYSQ- Problem bei Abfrage über 2 Tabellen mit If und IFNULL

    Hallo allerseits!!!!
    Mit MySQL beschäftige ich mich nun schon seit paar Monaten. Bis jetzt hab ich eigentlich viel gelernt, nur im Moment komm ich gerae nicht weiter. Also hier mein Problem.

    Ich habe eine sehr komplexe Struktur, die insgesamt 21 Tabellen beinhaltet und von denen sehr viele miteinander verknüft sind. Die Struktur entspricht auch der 1. bis 3. Normalform. Bei meinem Problem geht es allerdings nur um 2 Tabellen und einer bestimmten Abfrage. Die 1. Tabelle heisst Produktinfo und die 2. Produktsatz.

    Spalten Tabelle1: id [AutoIncrement| int(11)| PK(für Tabelle2-id_produktx)]
    name_produkt [char(50)|NULL-ja|]
    materialnummer [int(11)| Unique|]

    Spalten Tabelle 2:
    produktsatznummer[AutoIncrement|int(11)|PK(für eine andere Tabelle)]
    id_produkt1[int(11)|FK (für Tabelle 1-id)|Index|NULL-ja]
    id_produkt2[int(11)|FK (für Tabelle 1-id)|Index|NULL-ja]
    id_produkt3[int(11)|FK (für Tabelle 1-id)|Index|NULL-ja]

    Jetzt ist es so, dass nicht jeder DAtensatz in Tabelle2 ein Wert für id_produktx hat. D.h., es gibt "Produktsätze" mit mehr oder weniger Produkten. Über Tabelle 1 soll dann der Name des Produktes (evt. später auch MAterialnummer) mit ausgegeben werden.

    Nun möchte ich über eine Abfrage, die Namen der Produkte verschiedener Produktsätze mir ausgeben lassen. Wenn in einem Datensatz es nur 2 Produkte gibt, sprich ein ID für id_produkt1 und id_produkt2, dann ist der Wert für id_produkt3 NULL.
    Meine Ziel ist es, dass ich eine Abfrage erstelle, bei der es egal ist, wie viele Spalten in der Tabelle 2 eines Datensatzes ausgefüllt sind, die mir die NAmen der Produkte ausgibt!
    Mein Idee war es, das ich einen Namen für jede Spalte der Tabelle 2 ausgeben lasse. Ist nun der Werte für id_produktx NUll, so soll ***kein Eintrag erscheinen***

    Hier mal mein Versuch:

    (Der Produktsatz 6 beschreibt ein Datensatz, in dem nur ein Wert für id_produkt1 vorhanden ist, id_produkt2 und 3 sind leer. Zur vereinfacherung des posten, poste ich hir nur die Abfrage für Produkt 1 und 2)

    SELECT

    IFNULL( IF (produktsatz.id_produkt1 IS NULL ,NULL,p1.name_produkt )

    ,"***kein Eintrag***" ) AS 'Name Produkt 1' ,

    IFNULL( IF (produktsatz.id_produkt1 IS NULL ,NULL,p2.name_produkt )

    ,"***kein Eintrag***" ) AS 'Name Produkt 2'


    FROM
    Produktsatz JOIN Produktinfo AS p1
    ON
    p1.id = Produktsatz.id_produkt1

    JOIN Produktinfo AS p2
    ON
    p2.id = Produktsatz.id_produkt2

    WHERE
    produktsatznummer =6


    Wenn ichs nur für Produkt1 , in dem ein Wert vorhanden ist, erstellen, wird der richtige Name ausgegeben. Wenn ichs nur für Produkt2 , in dem kein Wert vorhanden ist, erstelle, kommmt keine Fehlermeldung aber auch kein Name!

    Ich hab das Gefühl, das beim dem Part " IF (produktsatz.id_produkt1 IS NULL ,NULL......" das Setzen des NULL nicht richtig funktioniert.

    Kann mir jemand dabei helfen??? Oder hat jemand ein anderen Lösungsvorshalg??? Ich komm da einfach nicht weiter!

    Vielen Dabk schon mal im voraus!!!!
    Viele Grüße

  • #2
    LEFT JOIN Produktinfo AS p2
    anstatt
    JOIN Produktinfo AS p2

    Comment


    • #3
      Zusätzlich zu @ebis
      [highlight=sql]IFNULL( IF (produktsatz.id_produkt1 IS NULL ,NULL,p1.name_produkt )

      ,"***kein Eintrag***" ) AS 'Name Produkt 1' [/highlight]

      Wenn ich das richtig interpretiere, hättest du es hier mit COALESCE() einfacher.

      p.s. Nutze bitte Formatierung von SQL in Beiträgen,
      Bei SQL-Code bitte beachten: Formatierung von SQL in Beiträgen

      Comment


      • #4
        Hallo..kann die Tipps leider erst ab MOrgen ausprobieren. Aber schon mal vielen Dank!

        Comment

        Working...
        X