SeRi: Problem mit SQL-Statement

Hallo Forumsteilnehmer,

ich habe Probleme mit einem SQL-Statement (MySql). Im Folgenden die Erläuterung der Tabellen:

Tabelle "agent_portfolio_2_categories": Vermittlertabelle zwischen der Portfolio-Tabelle und der Kategorien-Tabelle

Tabelle "data_portfolio": Portfolio-Daten

Tabelle "define_portfolio_categories": Kategorien

Die Kategorientabelle bildet mittels eines ParentId-Feldes eine Hierarchie mit zwei Ebenen ab:

Id | Name ParentId
----------------------------------------
1 | Leinwand NULL
2 | Frauenportraits 1
3 | Abstraktes 1
4 | Andere Themen 1
5 | Tonpapier NULL
6 | Anderes Material NULL

Die Abfrage für die Hierarchie muss also folgendermaßen lauten:
----------------------------------------------------------------------------
SELECT
    Level1.Id AS MainId,
    Level1.Name AS MainCategory,
    Level2.Id AS SubId,
    Level2.Name AS SubCategory
FROM
    define_portfolio_categories AS Level1
LEFT JOIN
    define_portfolio_categories AS Level2
ON
    Level2.ParentId = Level1.Id
WHERE
    Level1.ParentId IS NULL
----------------------------------------------------------------------------

Nun sollen natürlich auch noch die Gemäldedaten aus der Portfolio-Tabelle über die Vermittlertabelle mit eingebunden werden:
----------------------------------------------------------------------------
SELECT
    Level1.Id AS MainId,
    Level1.Name AS MainCategory,
    Level2.Id AS SubId,
    Level2.Name AS SubCategory,
    Portfolio.Id,
    Portfolio.Name,
    Portfolio.Filename,
    Portfolio.Material,
    Portfolio.Width,
    Portfolio.Height
FROM
    data\_portfolio AS Portfolio
LEFT JOIN
    agent_portfolio_2_categories AS Portfolio2Categories
ON
    Portfolio.Id = Portfolio2Categories.PortfolioId
LEFT JOIN
    define_portfolio_categories AS Level1
ON
    Level1.Id = Portfolio2Categories.CategoryId
LEFT JOIN
    define_portfolio_categories AS Level2
ON
    Level2.ParentId = Level1.Id
WHERE
    Level1.ParentId IS NULL
ORDER BY
    Portfolio.Name
----------------------------------------------------------------------------

Hier kommt allerdings immer Murx raus, egal was ich schon versucht habe zu verändern.

    1. Hi,

      http://www.computerbase.de/forum/showthread.php?t=359923

      Wolltest du darauf hinweisen, dass der Threadstarter sein Problem bereits in einem anderen Forum diskutiert?

      Dann such' aber noch mal den Link zum *richtigen* Problem raus - denn das verlinkte ist es ziemlich sicher nicht.

      MfG ChrisB

      --
      Light travels faster than sound - that's why most people appear bright until you hear them speak.
  1. Hi!

    Hier kommt allerdings immer Murx raus, egal was ich schon versucht habe zu verändern.

    Beschreibe bitte das, was du nicht als Murx bezeichnen würdest. Denn das was du haben willst, sagst du nicht, das müsste man sich zusammenreimen und kann dabei falsch liegen. Abgesehen davon, hast du schon probiert, die Kategorien-Abfrage als Subselect in der FROM-Klausel einzubinden? Außerdem: Wenn du nicht sagst, was du schon probiert hast, können beim Antworten auch genau die Ideen kommen, die du schon probiert hast. Es ist dann für beide Seiten keine sehr zufriedenstellende Diskussion. Für den Frager kommt nichts neues raus, und die Antwortenden gegen sich umsonst Mühe.

    Lo!

    1. Hallo,

      habe jetzt eine Hintertür-Lösung gefunden, aber ich hätte gerne die "feine englische Art". Will sagen: Kann man diese beiden durch "UNION" verbundenen SELECTS auch in einem zusammenfassen?:

      (SELECT
          Level1.Id AS MainId,
          Level1.Name AS MainCategory,
          Level2.Id AS SubId,
          Level2.Name AS SubCategory,
          Portfolio.Id,
          Portfolio.Name,
          Portfolio.Filename,
          Portfolio.Width,
          Portfolio.Height
      FROM
          define_portfolio_categories AS Level1
      JOIN
          define_portfolio_categories AS Level2
      ON
          Level2.ParentId = Level1.Id
      LEFT JOIN
          agent_portfolio_2_categories AS Portfolio2Categories
      ON
          Portfolio2Categories.CategoryId = Level2.Id
      LEFT JOIN
          data_portfolio AS Portfolio
      ON
          Portfolio2Categories.PortfolioId = Portfolio.Id)
      UNION (SELECT
          Level1.Id AS MainId,
          Level1.Name AS MainCategory,
          Level1.ParentId AS SubId,
          Level1.ParentId AS SubCategory,
          Portfolio.Id,
          Portfolio.Name,
          Portfolio.Filename,
          Portfolio.Width,
          Portfolio.Height
      FROM
          define_portfolio_categories AS Level1
      LEFT JOIN
          agent_portfolio_2_categories AS Portfolio2Categories
      ON
          Portfolio2Categories.CategoryId = Level1.Id
      LEFT JOIN
          data_portfolio AS Portfolio
      ON
          Portfolio2Categories.PortfolioId = Portfolio.Id
      WHERE
          Level1.ParentId IS NULL
      ORDER BY
          Level1.Order,
          Level2.Order,
          Portfolio.Name)

      Danke.

      1. Hi!

        habe jetzt eine Hintertür-Lösung gefunden, aber ich hätte gerne die "feine englische Art". Will sagen: Kann man diese beiden durch "UNION" verbundenen SELECTS auch in einem zusammenfassen?:

        Wenn du dazu einen Vorschlag haben willst, solltest du noch das Problem dazu beschreiben. Wie sehen die Ausgangsdaten aus und was möchtest du konkret erreichen? Unkommentierter, wenn auch (über)formatierter Code liest sich schwer. Und ohne das Wissen um die zu verarbeitenden Daten und das gewünschte Ergebnis kann man im Prinzip nur Rätselraten.

        Lo!