[MySQL 4.0] Problem mit IN(spalte)

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

  • [MySQL 4.0] Problem mit IN(spalte)

    Habe ein Problem mit IN():

    Folgende Tabelle: (Falls Dump gewünscht, bitte Melden.)
    id | url | category | forbiddencategories
    1 | bla.de | 3 | 5,7,9

    Folgende Query
    Code:
    SELECT  * 
    FROM  `lc_urls` 
    WHERE 5 IN (`forbiddencategories`);
    Liefert mir wunderbar diesen DS. Sobald ich aber
    Code:
    SELECT  * 
    FROM  `lc_urls` 
    WHERE 7 IN (`forbiddencategories`);
    verwende, wird mir dieser DS nicht mehr geliefert. Obwohl 7 ebenfalls in forbidden categories gelistet ist. Mehrere Versuche haben ergeben, dass nur der erste Wert der Aufzählung (Komma) in forbiddencategories erkannt wird. die folgenden nicht.

    Was kann ich dagegen Unternehmen? Alternativen?

    Es sollen eben alle DS gelifert werden, die eine bestimmte ID in der Auflistung in forbiddencategories haben.

  • #2
    Mhn, schonmal versucht das 5,7,9 in "5","7","9" umzuwandeln, damit er alle Zeichen als einzelne Strings erkennt und nicht nur alle als einen?

    (Obwohl ich zugeben muss das da ein kleiner Logik Fehler ist (wieso sollte er sonst erkennen das 5 IN (lala) drin ist wenn er alles als ein String sieht?) ist es eventuell ein Versuch wert )
    Zuletzt geändert von Floriam; 28.05.2005, 18:22.
    PHP Handbuch - MySQL Handbuch - PHP Einsteiger Tutorial - CSS Referenz - Browserunterstützung von CSS

    Kommentar


    • #3
      Liefert leider das erwartete Ergebnis. Die 7 wird NICHT erkannt.

      Da die Expression (7) ein Interger ist, wird Value nach dem selben Typ behandelt. Dadurch wird aus 5,7,9 nur 5. Nur logisch dieses Verhalten.

      Ich frage mich jedoch, wie ich das ganze nun umgehen kann.

      Kommentar


      • #4
        Mal ganz doof gefragt:

        Wieso kannst du die 7 nicht einfach in einen String umwandeln und somit das unten genannte Verhalten umgingen wird?


        (Ich möchte ja schließlich auch was lernen )
        PHP Handbuch - MySQL Handbuch - PHP Einsteiger Tutorial - CSS Referenz - Browserunterstützung von CSS

        Kommentar


        • #5
          Code:
          SELECT  * 
          FROM  `lc_urls` 
          WHERE `forbiddencategories` IN (5,7,9);
          mal so herum probiert?

          Kommentar


          • #6
            Naja, das macht sogar noch weniger Sinn als mein Beitrag..
            PHP Handbuch - MySQL Handbuch - PHP Einsteiger Tutorial - CSS Referenz - Browserunterstützung von CSS

            Kommentar


            • #7
              nach ansi sql macht das durchaus sinn...

              Zuletzt geändert von ankh; 29.05.2005, 10:08.

              Kommentar


              • #8
                Nö. Macht in meinen Augen auch keinen Sinn. Denn woher soll ich die 5,7,9 denn herzaubern. Die stehen zusammen mit vielen anderen DS dieser Form in der DB. Es geht mir darum alle DS mit 7 drin zu holen. Nicht alle mit "5,7,9":
                Es sollen eben alle DS gelifert werden, die eine bestimmte ID in der Auflistung in forbiddencategories haben.

                Wieso kannst du die 7 nicht einfach in einen String umwandeln und somit das unten genannte Verhalten umgingen wird?
                Klar könnte ich die 7 in einen String umwandeln. Aber dann wird der Wert in der Tabelle immer noch als ein zusammengehörender String behandelt. Weil ich eben alles in einem Value angegeben habe, und nicht in drei getrennten.

                Sieht fast so aus, als ob ich nicht um eingangs genannte normalisierung herum komme. Will ich aber nicht, wegen zu viel aufwand. Ich bräuchte es aber definitiv nur für diese eine Query.

                Kommentar


                • #9
                  hmm... mit der regex engine von mysql kannst da auch nix zaubern?

                  Kommentar


                  • #10
                    hmm... mit der regex engine von mysql kannst da auch nix zaubern?
                    Da ich bis jetzt auf keine brauchbare stringfunktion gestoßen bin, schwebt mir auch ne regex-lösung vor. Diese hab ich aber noch nicht.

                    Kommentar


                    • #11
                      Ich würde es zwar "richtig unsauber" nennen aber es ist immerhin eine Notlösung


                      Code:
                      SELECT title
                      FROM cats
                      WHERE INSTR(CONCAT(',', categories, ','), ',7,') > 0
                      Probier es mal aus, bei mir hats funktioniert..


                      MfG Floriam
                      PHP Handbuch - MySQL Handbuch - PHP Einsteiger Tutorial - CSS Referenz - Browserunterstützung von CSS

                      Kommentar


                      • #12
                        Wenn ich ehrlich bin, finde ich das gar nicht mal so unsauber. hatte das nämlich zwischenzeitlich mal mit LIKE (WHERE CONCAT(",",forbiddencategories,",") LIKE "%,5,%") gemacht.

                        Werd mal die Tabelle aufplustern und gucken, welches schneller ist.

                        Schönere Möglichkeiten sind aber immernoch willkommen!´

                        EDIT:
                        Mir ist grad noch aufgefallen, dass du um INSTR(....) > 0 noch ne Klammer setzen musst, bzw. > 0 unnötig ist.
                        Zuletzt geändert von TobiaZ; 29.05.2005, 13:26.

                        Kommentar


                        • #13
                          Schönere Möglichkeiten sind aber immernoch willkommen!
                          normalisieren.
                          Die Zeit hat ihre Kinder längst gefressen

                          Kommentar


                          • #14
                            wie gesagt, war mein aller erster gedanke. aber eigentlich zu viel Aufwand, da die Einträge eigentlich nur ausgelesen werden. Und da geht es ohne Normalisierung um einiges einfacher/schneller.

                            Das ist die einzige Query, in der eben der Inhalt der Spalte gebraucht wird...

                            Kommentar


                            • #15
                              Hi,

                              hätte da noch eine Lösung:

                              SELECT *
                              FROM `lc_urls`
                              WHERE forbiddencategories REGEXP '[[:<:]]7[[:>:]]'

                              Hab die Geschwindigkeit nicht getestet, denke jedoch das es schneller als Deine Lösung sein wird.

                              Falls es jemand testen sollte, bitte um Feedback.
                              Zuletzt geändert von Sebastian W; 31.05.2005, 15:09.
                              Grüsse,
                              Sebastian


                              Profil Flex Freelancer
                              Twitter twitter.com/flashhilfe
                              Web Flash und Flex Community

                              Kommentar

                              Lädt...
                              X