MySQL: Join View mit 'relativer' WHERE-Bedingung
Bastian Schnitzler
- datenbank
Hallo!
Ich habe ein Newsscript, das News in Kategorien einordnet. Nun will ich Daten einer News abfragen und gleichzeitig in einem Feld alle Elternkategorien auflisten, wozu ich aber eine Info der Hauptkategorie brauche.
Sagen wir, ich habe eine News in der Kategorie "Porsche", eine Unterkategorie von "Autos" und diese wiederum von "Fahrzeuge". Nun brauche ich aber eine Information aus der Tabellenzeile "Porsche" um auf die Kategorien "Autos" und "Fahrzeuge" zu schliessen.
Mein Traumquery sieht ungefaehr so aus:
SELECT GROUOP_CAT(kat2.katname), news.title, (@bedingung = kateg.besondererschluessel) from news JOIN kateg on news.katid = kateg.id JOIN ( SELECT katname FROM kateg WHERE kateg.besondererschluessel < @bedingung) GROUP BY news.title
Leider funktioniert das mit der Variable nicht (ich habe irgendwo gelesen, Variablen wuerden erst dann ausgewertet, wenn das Ergebnis zurueck an den User geschickt wird). Kann mir irgendjemande mit einem Loesungsvorschlag helfen?
Viele Gruesse,
Bastian
Hallo Bastian,
Sagen wir, ich habe eine News in der Kategorie "Porsche", eine Unterkategorie von "Autos" und diese wiederum von "Fahrzeuge". Nun brauche ich aber eine Information aus der Tabellenzeile "Porsche" um auf die Kategorien "Autos" und "Fahrzeuge" zu schliessen.
nette aber so unbrauchbare Informationen. Nicht "Sagen wir", sondern "Zeige uns!"
Kann mir irgendjemande mit einem Loesungsvorschlag helfen?
wenn Du eine anständige Fragestellung mit den relevanten Tabellen und ein paar Beispieldatensätzen lieferst, sowie dem gewünschten Abfrageergebnis - und da der zugehörigen Beschreibung, dann wird man Dir vermutlich auch helfen können
Freundliche Grüße
Vinzenz
Hallo!
Ich habe ein Newsscript, das News in Kategorien einordnet. Nun will ich Daten einer News abfragen und gleichzeitig in einem Feld alle Elternkategorien auflisten, wozu ich aber eine Info der Hauptkategorie brauche.
Sagen wir, ich habe eine News in der Kategorie "Porsche", eine Unterkategorie von "Autos" und diese wiederum von "Fahrzeuge". Nun brauche ich aber eine Information aus der Tabellenzeile "Porsche" um auf die Kategorien "Autos" und "Fahrzeuge" zu schliessen.
Ist die Schachtelungstiefe der Kategorien konstant oder gibt es zumindest eine Obergrenze?
Mein Traumquery sieht ungefaehr so aus:
SELECT GROUOP_CAT(kat2.katname), news.title, (@bedingung = kateg.besondererschluessel) from news JOIN kateg on news.katid = kateg.id JOIN ( SELECT katname FROM kateg WHERE kateg.besondererschluessel < @bedingung) GROUP BY news.title
Diese Query erhellt Dein Problem nicht.
Leider funktioniert das mit der Variable nicht (ich habe irgendwo gelesen, Variablen wuerden erst dann ausgewertet, wenn das Ergebnis zurueck an den User geschickt wird). Kann mir irgendjemande mit einem Loesungsvorschlag helfen?
Du könntest "kateg" ein (NULLable) Feld "parent_id" hinzufügen und per
FOREIGN KEY (parent_id) REFERENCES kateg(id)
zur Eltern-Kategorie verweisen lassen.
Bitte vorsorglich Versionsnummer von MySQL, Plattform und verwendete Programmiersprache angeben!
Falls die Schachtelungstiefe beliebig sein soll, wird's etwas komplex; beantworte bitte erst mal die Rückfrage und liefere die Info.
Grüsse
Solkar
Ist die Schachtelungstiefe der Kategorien konstant oder gibt es zumindest eine Obergrenze?
Nein, ist sie nicht, mit einer Obergrenze koennte ich mich abfinden, so bei 5,6 Verschachtelungen
Bitte vorsorglich Versionsnummer von MySQL, Plattform und verwendete Programmiersprache angeben!
Mysql-Version: 4.1.22, Ich verwende PHP 4.4.7, der Server lauft unter Linux, habe dort aber nur Webspace, also keine Adminstrations- oder Konfigurationsmoeglichkeiten.
Um es besser zu Formulieren: Ich verwende ein Adressierungssytem fuer Kategorien, bei der jeder Kategorie ein Links- und ein Rechtswert zugewiesen wird (beschrieben auf unten angehaengter Website), kenn ich nun links und rechts der Kategorie, in der sich eine News tatsaechlich befindet, kann ich mit der Abfrage
SELECT katname from katg WHERE links < (Linkswert der untersten Kategorie) AND rechts > (Rechtswert der untersten Kategorie)
alle Ueberkategorien herausfinden und so einen Kategoriebaum erstellen.
Dies will ich alles in einem Query machen, indem ich eben diese Abfrage machen, sie grouppiere und die Kategorienamen aneinanderhaenge (mit GROUP_CAT) und dies schliesslich mit der Abfrage ueber meines News verbinde.
Spaeter kann ich dann in PHP ganz einfach ueber explode die Vaterkategorien auslesen (wenn es denn klappt).
Gruss,
Bastian
Hallo,
Bitte vorsorglich Versionsnummer von MySQL, Plattform und verwendete Programmiersprache angeben!
Mysql-Version: 4.1.22, Ich verwende PHP 4.4.7, der Server lauft unter Linux, habe dort aber nur Webspace, also keine Adminstrations- oder Konfigurationsmoeglichkeiten.
beides alt und nicht mehr unterstützt. Sehr schön.
Um es besser zu Formulieren:
Du verwendest das Nested-Set-Muster.
Dies will ich alles in einem Query machen, indem ich eben diese Abfrage machen, sie grouppiere und die Kategorienamen aneinanderhaenge (mit GROUP_CAT) und dies schliesslich mit der Abfrage ueber meines News verbinde.
ohne Beispieldaten und ein Beispielergebnis mit Begründung wird man Dir nicht weiterhelfen können. Deine Angaben sind viel zu dürftig. Vermutlich wird es gehen, möglicherweise wird es gar nicht so schwer sein, aber hellsehen kann ich nicht.
Freundliche Grüße
Vinzenz
Hallo Vinzenz!
ohne Beispieldaten und ein Beispielergebnis mit Begründung wird man Dir nicht weiterhelfen können. Deine Angaben sind viel zu dürftig. Vermutlich wird es gehen, möglicherweise wird es gar nicht so schwer sein, aber hellsehen kann ich nicht.
Aber manche Antworter, ich z.B., versuchen es halt trotzdem immer wieder, da viele Kunden meinen, dass es zur Kernkompetenz eines Entwicklers gehört, natursprachlich formulierte Anforderungen erfassen und sinnvoll ergänzen zu können.
Außerdem hat der TE seine Anforderungen mittlerweile hinreichend klar geschildert, also was bezweckst Du eigentlich?
Grüsse
Solkar
Ist die Schachtelungstiefe der Kategorien konstant oder gibt es zumindest eine Obergrenze?
Nein, ist sie nicht, mit einer Obergrenze koennte ich mich abfinden, so bei 5,6 Verschachtelungen
Hat sich erledigt, da Deine Datenstruktur schon auf beliebige Schachtelungstiefen angepasst ist.
Bitte vorsorglich Versionsnummer von MySQL, Plattform und verwendete Programmiersprache angeben!
Mysql-Version: 4.1.22,
Also gibt es SUB-Queries
Ich verwende PHP 4.4.7, der Server lauft unter Linux,
Also gibt es kein ADO; damit hätte man dies nämlich etwas schlanker halten könen
habe dort aber nur Webspace, also keine Adminstrations- oder Konfigurationsmoeglichkeiten.
Um es besser zu Formulieren: Ich verwende ein Adressierungssytem fuer Kategorien, bei der jeder Kategorie ein Links- und ein Rechtswert zugewiesen wird (beschrieben auf unten angehaengter Website),
Das meinte ich mit "komplex"; gut, das Du das schon hast!
kenn ich nun links und rechts der Kategorie, in der sich eine News tatsaechlich befindet, kann ich mit der Abfrage
SELECT katname from katg WHERE links < (Linkswert der untersten Kategorie) AND rechts > (Rechtswert der untersten Kategorie)
Hab grad nicht die Zeit um die Struktur jetzt nachzubilden aber ich wage mal einen Ansatz:
SELECT GROUP_CAT(k_tree.kat_name), n.irgendwas FROM news n
INNER JOIN katg k1
ON n.katg_id = k1.id
INNER JOIN (SELECT k2.katname, k2.links, k2.rechts from katg k2) k_tree
ON (k_tree.links <= k1.links AND k1.rechts >= k_tree.rechts);
Die Syntax ist nicht geprüft; da musst Du vlt. nachbessern aber meine Grundidee ist, dass Du aus Deiner WHERE-clause einen JOIN machst.
Wie geasagt, das ist ungeprüft, aber vlt. hilft's ja.
Grüsse
Solkar
alle Ueberkategorien herausfinden und so einen Kategoriebaum erstellen.
Dies will ich alles in einem Query machen, indem ich eben diese Abfrage machen, sie grouppiere und die Kategorienamen aneinanderhaenge (mit GROUP_CAT) und dies schliesslich mit der Abfrage ueber meines News verbinde.
Spaeter kann ich dann in PHP ganz einfach ueber explode die Vaterkategorien auslesen (wenn es denn klappt).Gruss,
Bastian
Die Syntax ist nicht geprüft; da musst Du vlt. nachbessern aber meine Grundidee ist, dass Du aus Deiner WHERE-clause einen JOIN machst.
Danke, hier hab ich jetzt den funktionierenden query:
SELECT GROUP_CONCAT( k3.catname ) , n.guid, k2.catid, n.title, k3.catname
FROM karate n
INNER JOIN categories k2 ON k2.catid = n.type
JOIN (
SELECT catname, left
, right
FROM categories
) AS k3 ON ( k3.left
< k2.left
AND k3.right
> k2.right
)
WHERE guid =33
GROUP BY guid
Mein Problem war, dass ich nicht wusste, dass man in der Join-Bedingungen auch mehrere Bedingungen und Groessenvergleiche anstellen darf.
Vielen Dank!
Gruss,
Bastian
Hallo Bastian,
Ich habe ein Newsscript, das News in Kategorien einordnet. Nun will ich Daten einer News abfragen und gleichzeitig in einem Feld alle Elternkategorien auflisten, wozu ich aber eine Info der Hauptkategorie brauche.
schaffst Du es die Daten einer News abzufragen - ohne die Elternkategorien?
Wenn ja, dann solltest Du mit dem von Dir angewandten Nested-Set-Muster auf die gleiche Art und Weise die Elternkategorien zu Deinem Ergebnis hinzuzufügen wie neulich die Anzahl der Kommentare.
1. Erstelle eine Abfrage, die die Daten der News liefert.
2. Erstelle eine Abfrage, die die Elternkategorien einer News liefert
3. Joine die beiden miteinander (die zweite ist wieder ein temporärer View, da
Du die GROUP-BY-Klausel mit der Aggregatsfunktion GROUP_CONCAT() verwendest).
Freundliche Grüße
Vinzenz