Kategorien als kommaseparierte Liste

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

  • Kategorien als kommaseparierte Liste

    Hallo zusammen,

    ich stehe gerade ein wenig auf dem Schlauch. Ich habe mehrere Datensätze in
    einer Tabelle stehen. Jeder Datensatz kann mehrere Kategorien haben, diese werden als kommaseparierte Liste (die ID's der Kategorien) in einer Spalte abgelegt.

    Ich hatte nun versucht das ganze mit
    PHP-Code:
    $kat '3';
    WHERE spaltenname IN('.$kat.'
    auszulesen. Es werden aber nur die datensätze ausgegeben, in denen nur 3 steht, nicht aber die in denen 2,3 oder 1,3 steht.

    Was mach ich falsch?

  • #2
    Poste doch mal den kompletten Query. Und zwar als Ausgabe mit echo.

    Peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      PHP-Code:
      SELECT FROM stamdaten WHERE vertriebszulassung IN(3

      Kommentar


      • #4
        Niimm FIND_IN_SET.

        Peter
        Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
        Meine Seite

        Kommentar


        • #5
          Herzlich Danke!
          PHP-Code:

          SELECT 
          FROM stamdaten WHERE FIND_IN_SET('.$kat.',vertriebszulassung); 

          Kommentar


          • #6
            Kommaseparierte Werte in der Datenbank sind ein Designfehler, der korrigiert gehört. Mit FIND_IN_SET() funktioniert es zwar scheinbar erstmal, aber weitere Probleme sind praktisch vorprogrammiert. Und je länger man den Fehler mitzieht, umso aufwändiger wird später die Korrektur.

            Kommentar


            • #7
              Hallo h3ll,

              mir kam vorhin noch die Idee die Kategorisierung komplett in eine separate Tabelle auszulagern.

              PHP-Code:
              local_id|foreign_id
                123        1
                123        2
                124        1
                125        1
                125        2
                125        3 

              Die Frage ist, on der "Datenbank-Designer" das so leisten kann. Ich bin nur derjenige der auslesen darf und Empfehlungen gibt.

              Welche Probleme könnten auftreten mit FIND_IN_SET()? Was wäre Dein Vorschlag? Die Zahl der Kategorien sowie der zugeordneten Datensätze (max 100) ist sehr überschaubar und wird auch nicht übermäßig zunehmen.

              Kommentar


              • #8
                Die separate Tabelle ist eine gute Idee und ist auch allgemein so üblich.

                Mit FIND_IN_SET() kann man keine vernünftigen Joins machen.

                Kommentar


                • #9
                  Dann schauen wir mal, was der "DB-Designer" leisten kann.

                  Kommentar


                  • #10
                    Meinst du mit "DB-Designer" einen Menschen oder ein Programm? Beide sollten wenigstens die ersten drei Normalformen kennen.

                    Kommentar


                    • #11
                      Ich denke ich formuliere meine Aussage neu:

                      "Dann schauen wir mal, was der "DB-Designer" zu leisten bereit ist."

                      Kommentar


                      • #12
                        ... und jetzt die separate Tabelle richtig auslesen

                        Ich steh schon wieder auf dem Schlauch, jetzt hab ich die separate Tabelle erstellt und bekomm es nicht hin diese richtig auszulesen. Folgendermaße sieht diese aus:
                        PHP-Code:
                        local_id|foreign_id
                          123        1
                          123        2
                          123        18
                          123        9

                          105        1
                          105        3 
                        In foreign_id stehen also die unterschiedlichen Kategorien, denen die ID's der Datensätze in local_id zugeordnet sind. Ich hab folgendes probiert:
                        PHP-Code:
                        $wert1 1;
                        $wert2 18
                        mysql_query
                        (SELECT local_id FROM tabelle_kategorien WHERE foreign_id IN($wert1,$wert2)); 
                        Hier hab ich zwar eine Ausgabe, die ist jedoch falsch, da die ID 123 UND 105 ausgeben wird. Ich brauch aber nur die
                        Datensätze bei denen beiden Werte ($wert1,$wert2) in foreign_id übereinstimmen. Ein AND also.

                        Folgende Abfrage gibt garnichts aus:
                        PHP-Code:
                        mysql_query(SELECT local_id FROM tabelle_kategorien WHERE 
                                                    foreign_id 
                        $wert1 AND foreign_id  $wert2); 
                        Zuletzt geändert von gruenspan; 10.02.2012, 16:07.

                        Kommentar


                        • #13
                          foreign_id und local_id sind komplett sinnlose Namen. Wie soll da jemand verstehen, auf welche ID da verwiesen wird?

                          Das selbe gilt für die Variablennamen $wert1 und $wert2.

                          Außerdem solltest du PHP vorerst komplett weglassen und erstmal nur in MySQL üben.

                          Kommentar


                          • #14
                            Die Spaltennamen sind im Original andere (uid_fonds, uid_kat), ich wollte nur Dummy-Namen. Auch wert1 und wert2 sind nur Platzhalter gewesen, na egal.

                            Hast Du einen Tipp oder ein Stichwort wie ich ansetzen könnte?

                            Kommentar


                            • #15
                              Selber gefunden:Fortgeschrittene Jointechniken: Der Selfjoin

                              Kommentar

                              Lädt...
                              X