Problem mit SQL-Statement
SeRi
- programmiertechnik
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.
Hi,
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
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!
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.
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!