Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Aus Nested Sets Content mit JOIN ermitteln

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Aus Nested Sets Content mit JOIN ermitteln

    Moin Moin,

    ich habe ein kleines Problem, dass ich gerne mit einer einzigen MySQL Anfrage gerne lösen wurde (Performance), anstatt die erste Anfrage auszuführen und die 2. mit PHP zusammenzubasteln.

    Es handelt sich um ein Kategoriesystem basierend auf 'Nested Sets'.

    tabelle_kategorie (Auszug)
    cat_id (prikey)
    cat_left
    cat_right

    tabelle_kategorie_inhalt_index
    cat_id *
    content_id *
    content_type *
    * Die Kombination dieser Elemente ergeben ein eindeutigen Identifikator, kein Primary KEY oder sonstiges.

    Anfrage Unterkategorien ermitteln (funktioniert):
    SELECT cat_id from tabelle_kategorie WHERE cat_left > 1 AND cat_right < 37
    Ergebnis MySqlNumRows = 17 (Unterkategorien ermittelt/Korrekt)

    Anfrage Inhalt anhand der ermittelten Unterkategorien ermitteln:
    SELECT (cat_id,)content_id, content_type WHERE cat_id=(Ermittelte IDs aus Anfrage)

    Diese Abfragen sollen so kombiniert werden (wenn dann höchstwahrscheinlich mit LEFT/RIGHT+JOIN, so dass in etwa folgendes Ergebnis steht (Beispiel).
    cat_id (ermittelt aus Anfrage kategorien) | content_id | content_type
    1|1|news
    2|3|news
    3|2|news
    3|4|news
    4|5|news
    4|6|news
    4|7|news

    Gibts dazu eine Lösung ohne PHP diese Abfragen zu kombinieren?
    Ein Beispiel wäre super

    Grüße TheRedox


  • #2
    Ja, nennt sich join...

    Kommentar


    • #3
      erc's Antwort ist keine Antwort auf meine Frage!

      Dir ist hoffentlich klar, das JOIN ganz groß im Titel dieses Threads vorkommt?
      Einstein Reloaded Comment

      Wenn du schon nichts beizutragen hast, dann lass es doch bitte!

      Für alle anderen die mich ärgern möchten noch folgende 2 Tipps (auch wenn es oft gut gemeint sein will):
      - Fragt mindestens einmal warum ich das so machen möchte und erklärt mir warum ich es in meinem system anders machen sollte.
      - Bestätigt mich mit Sachen die sich aus der Fragestellung bereits ergeben haben.

      Die zwei Punkte alleine heben meine Hemmschwelle mich in einem Forum zu registrieren und mich dort heimisch zu fühlen mit einem Multiplikator, und oftmals ist es so das man sowas durchgehend immer wieder in Threads vorkommt an denen man sich an solchen "Beiträgen" durchscrollen muss, bis man irgendwann auch bei klarer, eindeutiger und ausführlicher Fragestellung/Darstellung des Problems mal überhaupt an einem Ansatz einer Lösung kommt weil (nach meinem Eindruck in solchen Foren) man sich oft erstmal durch die Klugscheisser- und Spamtrupps kämpfen muss.

      Auch wenn es hart klingt und der Ton für ein Neuzugang nicht gerade angemessen ist, möchte ich mal definitiv diese Art des Verhaltens zumindestens darstellen und kritisieren, weil ich es als ziemlich frustierend empfinde (mimimi, mach ich lieber selbst).

      Mit freundlichen Grüßen
      TheRedox

      Kommentar


      • #4
        Anstatt so viel Energie für diesen Belehrungspost aufzubringen(Respekt dafür, da muss man auch erstmal Bereitschafft für aufbringen den Einstieg ins Forum so zu gestalten), hättest du lieber mal genauer beschreiben können, wo denn das eigentliche Problem liegt. Das geht für mich aus deinem Startpost nicht klar hervor.

        Diese Abfragen sollen so kombiniert werden (wenn dann höchstwahrscheinlich mit LEFT/RIGHT+JOIN, so dass in etwa folgendes Ergebnis steht (Beispiel).
        Ja und wo hängts jetzt? Join-Syntax, allgemeines Verständis zu Joins?
        Relax, you're doing fine.
        RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

        Kommentar


        • #5
          Zitat von theredox
          Diese Abfragen sollen so kombiniert werden (wenn dann höchstwahrscheinlich mit LEFT/RIGHT+JOIN, so dass in etwa folgendes Ergebnis steht (Beispiel).
          ...
          Gibts dazu eine Lösung ohne PHP diese Abfragen zu kombinieren?
          Zitat von erc
          Ja, nennt sich join...
          Zitat von theredox
          erc's Antwort ist keine Antwort auf meine Frage!
          Was dann? Du hattest eine Vermutung, daraus resultierend eine Frage (es gibt keine zweite Frage in deinem Post) und erc hat sie beantwortet. Was fehlt dir noch? Wolltest du ein Beispiel (fordern)?
          Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
          PHP.de Wissenssammlung | Kein Support per PN

          Kommentar


          • #6
            Benutz einen Join. Sollte funktionieren.
            Zitat von derwunner
            "Ein FISI ist auf gut-deutsch der Netzwerker. Das heißt Du gehst rauß zum Kunden oder auf die Straße und verlegst Leitungen" - derwunner 2015

            Kommentar


            • #7
              Zitat von theredox Beitrag anzeigen
              erc's Antwort ist keine Antwort auf meine Frage!
              Es ist sogar die Lösung auf deine Frage. Anhand deines auftretens bin ich davon ausgegangen du bis fähig genug ein 08/15 join zu schreiben. Es soll ja durchaus vorkommen das man den Wald vor lauter Bäumen nicht sieht. Für mich stellt sich das Problem ähnlich dem dar: 1+5=?...

              Kommentar


              • #8
                Aus Nested Sets Content mit JOIN ermitteln, so lautet der Titel der Geschichte hier.

                Alle anderen Optionen habe ich durchgewurstelt z.B. UNION, die passt aber mit Sicherheit nicht mit JOINs habe ich auch rumexperimentiert mit PHPMyAdmin bin aber zu keinen vernünftigen lauffähigen Ergebnis gekommen.

                Zu den hochwahrscheinlichen JOINS passt eher folgender Text:
                ich habe ein kleines Problem, dass ich gerne mit einer einzigen MySQL Anfrage gerne lösen wurde (Performance), anstatt die erste Anfrage auszuführen und die 2. mit PHP zusammenzubasteln.
                Simple SELECT, INSERTS, DELETES, DROPS, wie auch immer sind für micht wahrlich kein Problem, jedoch kommen JOINs alle paar Monate mal vor, das Problem ist eindeutig dass ich die Struktur inkl. einer AS Notation nicht ordentlich geregelt bekomme.

                Wenn ich also die 2 SELECT BEISPIELE mir raussuche und diese Kombiniere müsste dann die Anfrage (wird jetzt ziemlich falsch sein) in etwa so aussehen.

                SELECT cat_id from tabelle_kategorie WHERE cat_left > 1 AND cat_right < 37 AS p
                RIGHT(OUTER?) JOIN SELECT (cat_id,)content_id, content_type WHERE cat_id=p.cat_ID AS n ORDER BY n.content_id

                Also anscheinend bin nicht fähig mir dieses Problem vom Hals zu schaffen, aber so sollte es ganz ganz grob aussehen.

                Kommentar


                • #9
                  Code:
                  SELECT
                     cat_id,
                     content_id,
                     content_type   
                  FROM
                     tabelle_kategorie   
                  LEFT JOIN
                     tabelle_kategorie_inhalt_index USING (cat_id)   
                  WHERE
                     cat_left > 1
                     AND cat_right < 7
                  bzw.
                  Code:
                  SELECT
                     kategorie.cat_id,
                     inhalt.content_id,
                     inhalt.content_type     
                  FROM
                     tabelle_kategorie kategorie   
                  LEFT JOIN
                     tabelle_kategorie_inhalt_index inhalt 
                        ON kategorie.cat_id = inhalt.cat_id      
                  WHERE
                     kategorie.cat_left > 1     
                     AND kategorie.cat_right < 7
                  Der Left Join liefert dir zu jeder cat_id, die die WHERE-Klausel erfüllt, aus der Kategorientabelle ein Resultset. Wenn die Join-Bedingung nicht erfüllt ist, keine entsprechende cat_id in der Inhaltetabelle, enthalten die rangejointen Spalten null.

                  [Bei der zweiten Query war das Spezifizieren der Tabelle im Select-Teil wegen der doppelten cat_id-Spalte notwendig, also hab ich das bei den anderen Spaltenbenennungen gleich mitgemacht.
                  Bei der Using-Syntax der ersten Query muss man die 'Join-Spalte' im Select-Teil nicht extra kennzeichnen, also hab ichs auch im Rest der Query nicht getan.]
                  Relax, you're doing fine.
                  RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

                  Kommentar


                  • #10
                    Geil! Ja war mal wieder alles andersrum als erwartet. Wer das Kind von der falschen Seite aufzieht, braucht sich nicht zu wundern das es schief geht. Also im Code sieht das alles etwas anders aus als an dem Beispiel hier, wenn ich eine PHP Variable habe die eine (Installationsnummer) hat also z.B. tabelle_kategorie_(001), sollte ich eher aus Sicherheitsgründen die erste Notation nehmen oder? Also momentan ist alles r/o von daher machts keine Probleme, wenn ich jedoch in die Zukunft schaue erachte ich es als sinnvoller

                    Noch kurz zum Belehrungspost, bin selber Forenadmin gewesen (weitaus kleinerer Umfang), entsprechend verbraucht und habe diesbezüglich eine Marotte dazugewonnen mit der ich nicht alleine bin, soll jeder damit anfangen was er für richtig hält.

                    Jedenfalls ein großes Dankeschön, damit werde ich eine gute Weile was anfangen können!
                    Auf USING/ON wäre ich ebenfalls nicht gekommen, benutze ich nie und kenne das Statement nicht wirklich, Nachholbedarf.

                    @ERC 'Ja, nennt sich join...' ist streng genommen nichtmal ein ganz ausformulierter Satz, außerdem hast du mind. 2 Mal auf diesen Titel geklickert das größte Wort war wohl Join, was anderes wäre ja auch nicht möglich gewesen. Die Antwort darauf war mein Buchstabenspielchen, der Rest waren Tipps für die Allgemeinheit, lass einfach gut sein, vllt. verstehst du was ich meine vllt. auch nicht.

                    So genug des Guten, schönes Wochenende!

                    --------------------------------------------------------------------------------

                    Wer noch ein ORDER BY dabei haben möchte, ich brauche es zumindest, folgendes:
                    SELECT
                    cat_id,
                    content_id,
                    content_type
                    FROM
                    tabelle_kategorie
                    LEFT JOIN
                    tabelle_kategorie_inhalt_index USING (cat_id)
                    WHERE
                    cat_left > 1
                    AND cat_right < 7
                    ORDER BY content_id DESC

                    Kommentar


                    • #11
                      Zitat von theredox Beitrag anzeigen
                      @ERC 'Ja, nennt sich join...' ist streng genommen nichtmal ein ganz ausformulierter Satz, außerdem hast du mind. 2 Mal auf diesen Titel geklickert das größte Wort war wohl Join, was anderes wäre ja auch nicht möglich gewesen. Die Antwort darauf war mein Buchstabenspielchen, der Rest waren Tipps für die Allgemeinheit, lass einfach gut sein, vllt. verstehst du was ich meine vllt. auch nicht.
                      Meine Auffassungsgabe lässt es leider nicht zu das ich mir jedes Wort merke. Ungefähr das bleibt nach dem lesen hängen: Ausgangslage: 2 Tabellen, Kategorien und Kategorie Inhalt, stehen in Beziehung über cat_id. Ziel: alle Einträge aus Kategrie Inhalt auslesen welche in der Tabelle Kategorien Bedingung XY erfüllen. Das ist ein INNER JOIN über cat_id. Die Frage war verständlich und fachlich korrekt formuliert. Du verwendest Nested Sets. Selbst einschätung PHP Fortgeschirtten. Muss ich da wirklich erklären wie ein join funktioniert? Hättest du mich NORMAL drauf hingewiesen, dass ich etwas übersehen habe, dass die Antwort zu oberflächlich war, hätte ich dir das auch entsprechend konkretisiert. Aber was ist das für ein Verhalt? Du bist gar nicht in der Lage zu beurteilen ob die Antwort richtig war und fängst an dumm rumzupöbeln.

                      Kommentar


                      • #12
                        Um eins klarzustellen, wildes rumgepöbel hat es nicht gegeben, ich hab dein Nickname nicht grade Nett behandelt, du hast es zwar ausgelöst das ich mich aufgeregt habe und meinen Frust mit bestimmten Typen von Antworten (mit denen ich nichts anfangen und viele womöglich auch nichts anfangen können) schlicht und einfach erklärt und das war definitiv nicht mehr persönlich auf dich bezogen und weder als gepöbel noch geflame gedacht.

                        Wer sich ein Ast abschreibt ärgert sich schonmal das ein Halbsatz eine Antwort für irgendwas sein soll, wie du selbst sagst sieht man schonmal ein Baum vor lauten Bäumen nicht (hoffe habe es grade richtig im Kopf) da kann man definitv sagen das es nicht hilfreich ist. Da ich so etwas erwartet habe, weil ich sowas in jedem X Thread von Forum Y so etwas sehe, hast du schlicht und einfach mein Nerv getroffen und da habe ich nunmal weder die normale Variante gewählt noch eine dumme Variante gewählt jedoch auch nicht die netteste sondern eine die am besten mein Gedanken dazu vermittelt.

                        Ja das hat mit normal nichts zu tun, es war mir anscheinend die Zeit wert das so zu machen in diesem Sinne der Anklage bekenne ich mich auch schuldig.

                        Ja ich habe mit PHP ziemlich viel zu tun, und mit CSS und mit HTML und mit JS und ganz knapp Flashgedöns und Javagedöns und wenn ich für sowas eine suboptimale Struktur mit 'AS' als Nested Sets/JOIN Abfrage noch in irgendeinem MYSQL uery habe und die Beispiele die man sucht nicht wirklich für das Verständnis hilfreich sind, werde ich auch nicht alles registrieren können was mal Monate zurückliegt und da werde ich nunmal auf von den Bäumen halt erschlagen.

                        PHP Fortgeschritten ist für mich eine ziemlich relative Angabe, ich kann zwar sagen dass ich einige MB an PHP durch habe, von bestimmten Sachen habe ich gar kein Plan und ich hab es vllt. vor 8 Jahren mal ein paar Monate gelernt. Zu sagen ich kann die Sprache wäre auch noch heute falsch, ich kann das gut was ich können muss und bin immer wieder froh neue Sachen zu endecken die ich als sinnvoll erachte für meine Zwecke sind und nutzen kann.

                        Ich könnte mich eigentlich noch Stundenlang dazu erklären, deswegen sagte ich auch zuletzt, lass gut sein. Ich hoffe das wir uns jetzt endgültig bezüglich dieser Angelegenheit verständigt haben.

                        Grüße TheRedox

                        Kommentar


                        • #13
                          OT:

                          (Oha, meine „Ausgleichsbewertungen“ bei dem „grünes Licht/rotes Licht“-Renommee-System hier machen aus einem -1 schon ein +2… Das ist definitiv broken…)

                          Jedenfalls (und sorry, dass ich auch noch was dazu sage ) empfand ich den „Exkurs“ von dir auch als überzogen. Ich schreibe, um das von der anderen Seite vielleicht noch mal ein wenig zu relativieren.

                          Das hier ist durchaus ein Forum, das in den Antworten gewissen Qualitätsansprüchen genügt. (Das gilt insbesondere auch für den Nutzer, gegen den du hier „schießt“, wenn ich mir die Bemerkung erlauben darf. ) Leute, die rumspammen oder durchgängig spitzfindig antworten, gibt es hier nahezu nicht, weil die Helfer auf so was auch wenig Lust haben. Wir würden das auch kritisieren. Natürlich ist nicht jede Antwort immer fachlich perfekt oder so, aber unser Problem ist zu 99 % die Qualität der Fragestellungen. (Um exemplarisch zu verdeutlichen, was ich meine: http://www.php.de/php-einsteiger/113...er-fehler.html.) Schlechte Fragen sorgen zwar auch nicht gerade dafür, dass hier die „guten“ Leute noch Lust auf Teilnahme haben, aber ich denke, dass wir trotz allem noch überraschend gut dabei sind.

                          Es kann sein, dass du aus anderen Foren schlimmere Zustände gewohnt bist (ich kann mir das wahrscheinlich vorstellen), aber mit pauschalen Vorverurteilungen tust du den Leuten hier wirklich unrecht. Da würde ich im Zweifel einfach mal tief durchatmen, gute Absichten annehmen und vielleicht auch ein wenig mitlesen, wie hier andere Threads ablaufen, um ein Gefühl für das Forum zu bekommen.

                          Das war jetzt wahrscheinlich nur der berüchtigte „falsche Fuß“, auf dem das hier losging.

                          Kommentar


                          • #14
                            (Oha, meine „Ausgleichsbewertungen“ bei dem „grünes Licht/rotes Licht“-Renommee-System hier machen aus einem -1 schon ein +2… Das ist definitiv broken…)
                            Angeber

                            nützliche Links zum Thema sql:
                            http://www.peterkropff.de/site/mysql/joins.htm Lesematerial
                            http://sqlfiddle.com Beispieldaten-Lieferungstool
                            http://www.freeformatter.com/sql-formatter.html beautify your Queries
                            http://www.navicat.com/de/ Mein Lieblingstool zum Arbeiten mit Datenbanken, die Lite-Version reicht schon aus um effektiv arbeiten zu können. Query-Builder ist nicht so toll -> lieber den Query-Editor nutzen.

                            - A Visual Explanation of SQL Joins
                            - SQL und relationale Algebra

                            http://de.slideshare.net/billkarwin/...ns-strike-back Präsentation zu SQL-Antipattern, good to read, kann auch das Buch empfehlen wo natürlich etwas tiefer auf die einzelnen Fälle eingegangen werden kann.
                            Relax, you're doing fine.
                            RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

                            Kommentar


                            • #15
                              Mh... das erste Modell hat einen kleinen Fehler den ich jetzt so lösen würde.

                              Wenn die Kategorie existiert aber nichts dazu kommt kommen solche Ausgaben vor (leere Kategorie), reicht es das so zu unterdrücken oder gibt es da noch eine elegantere Lösung?

                              cat_id|content_id|content_type
                              27|NULL|NULL
                              28|NULL|NULL

                              Code:
                              SELECT
                                 cat_id,
                                 content_id,
                                 content_type   
                              FROM
                                 tabelle_kategorie   
                              LEFT JOIN
                                 tabelle_kategorie_inhalt_index USING (cat_id)   
                              WHERE
                                 cat_left > 1
                                 AND cat_right < 7
                              AND content_id IS NOT NULL

                              Kommentar

                              Lädt...
                              X