Bastian Schnitzler: MySQL: Join View mit 'relativer' WHERE-Bedingung

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

  1. 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

  2. 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

    1. 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

      1. 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

        1. 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

      2. 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

        --
        In the beginning, the Giver Of Data created the Kernel and the C.
        And the C was without main and (void*).
        Thus spake the Giver Of Data: Thou shalt indent with four spaces. No more, no less.
        Four shall be the number of spaces thou shalt indent, and the number of thy
        indenting shall be four. Eight shalt thou not indent, nor either indent thou
        two, excepting that thou then proceed to four. Tabs are right out.
        ie:} fl:{ br:> va:{ ls:} fo:# rl:( n4:? ss:} de:> js:) ch:? sh:( mo:? zu:(
        1. 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

  3. 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