Ankündigung

Einklappen
Keine Ankündigung bisher.

WERT in Column mit serialisierten array als Inhalt

Einklappen

Neue Werbung 2019

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

  • WERT in Column mit serialisierten array als Inhalt

    Hallo liebe Leute,

    ich habe ein Problem und weiß nicht wirklich ob es mit einer SQL Abfrage zu lösen ist. Ich habe eine Tabelle, die in einer Spalte (VARCHAR) als Inhalt serialisierte arrays hat diese Arrays enthält. Die Arrays enthalten von einem INT bis 16 INT.
    Nun dachte ich daran eine Abfrage zu schreiben die in etwa so ist.
    Code:
    SELECT * FROM `table` WHERE `column` IN (19)
    Sinn ist, ich möchte nur die Datensätze, in deren array eine 19 ist. Meine Idee funktioniert leider nicht.
    Kann mir jemand einen Tipp geben oder muss ich alle abfragen und dann das Ergebnis filtern?

  • #2
    Sorry für die Aufregung, ein einfaches LIKE macht es auch

    Kommentar


    • #3
      Wie sehen denn dein LIKE und deine serialierten Daten aus?
      Bei einfachen Lösungen mit Like werden schnell auch falsche Einträge geliefert.
      Zudem ist es immer für alle Mitleser schön, zu einer Frage auch eine Lösung zu finden.

      Kommentar


      • #4
        Zitat von Cyclestores Beitrag anzeigen
        Sorry für die Aufregung, ein einfaches LIKE macht es auch
        Depends. Fehleranfällig und schnachlahm, wenn nicht indexbasiert gesucht werden kann. Und exakt das wird wohl nicht gehen, bei billigen Datenbanken.
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          ot
          Zitat von akretschmer Beitrag anzeigen
          ..indexbasiert ... Und exakt das wird wohl nicht gehen, bei billigen Datenbanken.
          Du meinst kostenlos oder billig? Sicher die neue Maria Version?!

          /ot

          Zum Thema:
          Schlecht ist ein Like natürlich, wenn es nicht treffsicher ist, aber so eingesetzt wird und aufgrund des Suchmusters keinen Index verwende<t|n kann>.
          Dramatisch dann bei großen Datenmengen.

          In der Praxis ist das letzt genannte Problem häufig dadurch abzumildern, dass der "Löwenanteil" der Filterung über andere Mechanismen (Schlüsselfeld Indizierung) läuft und dann nur ein paar Kröten zum "Fullscan" für Like übrigbleiben.

          Kommentar


          • #6
            kostenlos != billig

            Der Fragesteller hatte in seinem Beispiel eine WHERE-Condition auf seinem 'Array'. Mit einer zwar kostenlosen, aber nicht 'billigen' Datenbank ginge dies so:

            Code:
            test=# create table array_demo (id serial primary key, werte int[]);
            CREATE TABLE
            test=*# create index idx_int_array on array_demo using gin (werte);
            CREATE INDEX
            test=*# insert into array_demo values (1, array[1,12,9,19, 191]);
            INSERT 0 1
            test=*# insert into array_demo values (2, array[12,121,19,1, 91]);
            INSERT 0 1
            test=*# explain analyse select * from array_demo where werte @> array[19];
                                                                  QUERY PLAN                                                       
            -----------------------------------------------------------------------------------------------------------------------
             Bitmap Heap Scan on array_demo  (cost=12.05..21.52 rows=6 width=36) (actual time=0.022..0.023 rows=2 loops=1)
               Recheck Cond: (werte @> '{19}'::integer[])
               Heap Blocks: exact=1
               ->  Bitmap Index Scan on idx_int_array  (cost=0.00..12.05 rows=6 width=0) (actual time=0.015..0.015 rows=2 loops=1)
                     Index Cond: (werte @> '{19}'::integer[])
             Planning time: 0.250 ms
             Execution time: 0.061 ms
            (7 Zeilen)
            PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

            Kommentar


            • #7
              Guten Morgen,
              hier die Auflösung in dem serialisierten Wert sind Indexschlüssel. so ein array zum Beispiel sieht dann so aus:
              PHP-Code:
              $classes= array(19,21,14,23); // Schlüssel aus ageclasses
              // und ageclass
              $ageclass['ak_nr'] = 19
              und

              Code:
              SELECT
              `1`.`id`,
              `1`.`name`,
              `2`.`name2`,
              `1`.`date`,
              `3`.`typ`
              
              FROM `1`
              JOIN `2` ON `2`.`id` = `1`.`event`
              JOIN `3` ON `3`.`id` = `1`.`typ`
              WHERE `1`.`classes` LIKE '%{$ageclass['ak_nr']}%'
              AND `1`.`date` > '{$today}'
              AND `2`.`Status` =2
              AND `1`.`typ` NOTLIKE6
              AND `1`.`typ` NOTLIKE7

              Kommentar


              • #8
                Code:
                '{$today}'
                Nimm doch gleich CURDATE()
                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


                • #9
                  Schaut ja ziemlich wild aus. Nummerierte Tabellennamen. Nummerierte Spaltennamen. Missachtung der 1. Normalform. Unntötige Verwendung von LIKE. Uneinheitliche Namensgebnug.

                  Wenn das Ziel war ein Paradebeispiel zu erstellen, wie man etwas NICHT machen soll, dann ist dir das voll und ganz gelungen. Viel mehr falsch kann man da nicht mehr machen.

                  Kommentar

                  Lädt...
                  X