Ankündigung

Einklappen
Keine Ankündigung bisher.

Verzeichnissbaum durchsuchen

Einklappen

Neue Werbung 2019

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

  • Verzeichnissbaum durchsuchen

    Hi,

    ich hab einen Verzeichnissbaum, der 3 Ebenen tief ist. (wird auch nicht tiefer)

    Nun müsste ich neue Artikel in diesen Verzeichnisbaum einstellen. Um das aber umsetzen zu können, müsste ich wissen, ob die Kategorie (wo der Artikel importiert werden soll) schon besteht oder nicht.
    Prinzipell ja kein Problem weil ich das ja durchlaufen kann.
    ABER: es gibt Kategorien, die den gleichen Namen tragen (in der 2ten und 3ten Ebene). Unterschiede gibt es nur in der 1sten Ebene.
    Müsste ich also mit 3 Schleifen arbeiten... was eher uncool ist.

    Dann dachte ich, ich mach ne Sub-Select bzw. ne JOIN Abfrage. Aber dafür ist meine DB-Struktur nicht ausgelegt.
    Bei einer JOIN Abfrage weiß ich nicht, (finde keine Doku) ob ich ein und die gleiche Tabelle 3 mal abfragen kann.


    Frage 1: bekomme ich es mit einer DB-Abfrage direkt hin ?

    Code:
    CREATE TABLE `kategorien` (
      `id` int(10) NOT NULL,
      `Kategoriename` varchar(100) NOT NULL,
      `parentID` varchar(100) NOT NULL,
      `HP` varchar(10) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    jtl4.jpg


    Eine DB-Abfrage wäre mir zwar am liebsten, weil direkte ausgabe... aber wenn das nicht geht, müsste ich ja mindestens 3 foreach-Schleifen bauen. Und innerhalb der 2ten und der 3ten Schleife bekomm ich mehrere Resultate zurück. Jedes Resultat müsste ich dann mit einer erneuten Schleife durchlaufen bis ich dann endlich den korrekten habe. Brauch ich also 3 Hauptschleifen und 2 weitere (auf 2ten und 3ten Ebende) um die doppelten rauszufiltern.
    Allein bei 5 Durchläufen komm ich mit der Programmierung nicht klar. Hier würde ich mal um Hilfestellung bitten wollen.

    Danke


  • #2
    Ist es nicht so, dass eine Kategorie mit der selben parentID nicht doppelt vorkommen darf?

    Kommentar


    • #3
      korrekt
      [id] ist einmalig und auto_increment
      [parentID] kommt sogar recht häufig (in der 2ten Ebende vor)

      Z.b.
      Bordello => Boots => Courtness
      Bordello => Boots => Unisex
      Bordello => Boots => Women
      Bordello => Boots => Men
      Bordello => Boots => Child
      etct etc

      Kommentar


      • #4
        Dann mach in der DB einen gemeinsamen UNIQUE Constraint über id und parent . Der verhindert ein doppeltes Einfügen solcher Werte.
        The string "()()" is not palindrom but the String "())(" is.

        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


        • #5
          Zitat von hausl Beitrag anzeigen
          Dann mach in der DB einen gemeinsamen UNIQUE Constraint über id und parent . Der verhindert ein doppeltes Einfügen solcher Werte.
          okay... kann man auch machen, wenn man auto_increment nicht vertraut. Is dann der paranodi-modus

          Aber meine Frage bezog sich ja auf die Abfrage. In der DB drin die Daten ja.
          Ich bekomme einen neuen Datensatz rein. Diese Datensatz sagt, dass die vorgesehene Kategorie Bordello => Boots => Men ist.
          Vorher muß ich aber prüfen, ob es eine solche Kategorie gibt. Ansosten importiere ich einen Toten Artikel.
          Da ich in der 2ten und 3ten immer mehrere Treffer zurückbekomme hab ich grad ein Kloß im Kopf und versuche eine sinnige Programmierung rauszubekommen.
          sprich: Wie kann ich eindeutig feststellen, ob es Bordello => Boots => Courtness (siehe Bild oben) gibt... oder nicht.

          Kommentar


          • #6
            Zitat von daniel_1998 Beitrag anzeigen
            Is dann der paranodi-modus
            Ähm nein, das ist der "sollte so sein" Modus. Genau dafür ist eine DB ja da um referentielle Intigrität (etc.) sicherzustellen. Wenn du das nicht machst hast du fürher oder später leicht mal Datenmist und/obwohl du manuelle (sinnlos) Prüfungen drinnen hast. Das ist ja eine der Stärken einer DB. Richtige Indizies sind immer zu setzen, alles andere wäre "sehr ungeschickt".

            Wie kann ich eindeutig feststellen, ob es Bordello => Boots => Courtness (siehe Bild oben) gibt... oder nicht
            Einfach mal anlegen. MySQL kann zB ein INSERT IGNORE. Wenn es die Kombi dann schon gibt (wegen des UNIQUE Constraint) dann passiert nichts. - wegen dem INSERT IGNORE.

            Bzw. siehe auch: INSERT ... ON DUPLICATE KEY UPDATE https://dev.mysql.com/doc/refman/5.7...duplicate.html
            The string "()()" is not palindrom but the String "())(" is.

            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


            • #7
              http://stackoverflow.com/questions/2...ecursive-query

              Kommentar


              • #8
                ok. das mit den UNIQUE kan ich noch nachvollziehen.

                INSERT IGNORE ist mir neu aber ein interessanter Ansatz, den ich sicherlich noch in anderen Projekten brauchen könnte.
                Mittels mysql_insert_id sollte dann sicherlich ermittelbar sein, ob der Eintrag schon vorhanden ist oder halt neu. Geschickter Befehl.

                Nur brauch ich in DIESEN Falle nun wirklich die Rückgabe, ob der Pfad existiert. Für ein anderes Script benötige ich alle 3 ID's.
                Für das einfügen komm ich mit INSERT IGNORE drum rum. Um mein anderes Script nicht, da mir die ID's ja s nicht bekannt sind und erst ermittelt werden müssen

                Kommentar


                • #9
                  Schau mal da: http://stackoverflow.com/questions/1...ecursive-query
                  The string "()()" is not palindrom but the String "())(" is.

                  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


                  • #10
                    huii... ich tipp zu langsam.... du warst schneller.

                    Schau ich mir grad an... habs nur überfogen. Schön, dass andere auch daran scheiterten.
                    Die lösungen sehen schon mal alle samt sehr komplex aus. Mal schaun, ob ich mit den JOIN Befehl tatsächlich zur Lösung komme

                    Kommentar


                    • #11
                      lol... ihr sitzt beide wohl nebeneinander (LOL)

                      Kommentar


                      • #12
                        ich mach Feierabend... die Beispiele sind toll... nur irgendwie klappt's nicht. 6h sind dann doch zu viel. Mal schaun, ob's morgen mit einen Frischen Kopf besser klappt.

                        http://sqlfiddle.com/#!9/85c41c/3

                        Diese 3 Daten hab ich fest:
                        Bordello
                        ___ Boots
                        ______ Courtness

                        Als Ergebniss bräuchte ich mininmal die [id] (hier jetzt 2)

                        Kommentar


                        • #13
                          Diese 3 Daten hab ich fest:
                          Bordello
                          ___ Boots
                          ______ Courtness
                          Wie? Als Text oder die ID? Was sind die Ausgangsdaten für deine Abfrage?
                          The string "()()" is not palindrom but the String "())(" is.

                          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


                          • #14
                            Klar, Du kannst eine Tabelle mehrfach joinen indem Du unterschiedliche Aliase vergibst.
                            In Deinem Fall brauchst als Join Verfahren einen Outer Join, je nach Schreibweise einen left oder right outer join.

                            Outer Joins haben die "gemeine Eigenart", dass nachgelagerte Bedingungen (in der where clause) das "outer" kastrieren, also zu keinem brauchbaren Ergebnis führen.
                            Da kann man nun verschiedene Gegenmaßnahmen ergreifen. Ich habe hier mal das Suchkriterium, das eigentlich in die Where Clause gehört, in das Join Kriterium integriert.

                            Dann bekommst Du an den gewünschten Stellen NULL als Ergebnis und weißt, "gibt's nicht".

                            Jenachdem wie nun die Kategorien gegeben sind, ist es unterschiedlich aufwendig, alle Effekte zu prüfen, Ist die Existenz in jeder Ebene fraglich, sieht ein Statement z.B. so aus. Das kannst Du noch etwas abspecken, wenn in 1. und oder 2. Ebene die Kategorien immer da sind (das muss natürlich sichergestellt sein).

                            Code:
                            select distinct 1st.id, 1st.Kategoriename, 2nd.id, 2nd.Kategoriename, 3rd.id, 3rd.Kategoriename
                              from `kategorien_HHG` 1st
                              left join `kategorien_HHG` 2nd on (1st.id = 2nd.parentid and 1st.Kategoriename = 'Bordello' and 2nd.Kategoriename = 'Boots')
                              left join `kategorien_HHG` 3rd on (2nd.id = 3rd.parentid and 3rd.Kategoriename = 'Courtness')
                             where 1st.parentID=0
                               and 1st.id is not null
                               and 2nd.id is not null
                            Das Statement kannst Du direkt als Datenquelle für ein Insert nehmen, wenn Du noch ein .. and 3rd.id is null anhängst und die einzutragende Kategorie als weiteres Feld mitlieferst,

                            Kommentar


                            • #15
                              Das Insert sähe dann so aus:
                              Code:
                              insert into `kategorien_HHG`
                                     (Kategoriename,parentID,HP )
                              select 'Courtness', 2nd.id, 'HHG'
                                from `kategorien_HHG` 1st
                                left join `kategorien_HHG` 2nd on (1st.id = 2nd.parentid and 1st.Kategoriename = 'Bordello' and 2nd.Kategoriename = 'Boots')
                                left join `kategorien_HHG` 3rd on (2nd.id = 3rd.parentid and 3rd.Kategoriename = 'Courtness')
                               where 1st.parentID=0
                                 and 1st.id is not null
                                 and 2nd.id is not null
                                 and 3rd.id is null
                              Es fügt nichts ein, wenn der Wert schon da ist.

                              Das kann natürlich auch nach hinten los gehen, wenn falsche Kategorien reinkommen.
                              Die festen Werte aus diesem Beispiel natürlich durch Parameter ersetzen.

                              Kommentar

                              Lädt...
                              X