Select wo zahl in id (und id hat meherer zahlen)

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

  • Select wo zahl in id (und id hat meherer zahlen)

    hallo leute
    ich versuche nun schon seit ner kleinen ewigkeit folgendes:
    also ich habe eine tabelle
    Code:
    tabelle_daten:
    ID (int)
    id_cat (varchar)
    id_event (int)
    start (datetime)
    stop (datetime)
    ...
    ein beispiel eines solchen datensatzes könnte sein:
    Code:
    1
    6,7,23,43,53
    34
    2012-12-12 12:32:09
    2123-12-12 21:21:21
    ...
    ihr seht, im feld "id_cat" stehen meherer zahlen (die ich per implode da reingespeichert habe).

    MEINE FRAGE nun:
    ich versuche die id aller einträge zu finden, die eine gewisse zahl in dieser zelle "id_cat" haben zu finden.

    ich habe folgende varianten versucht und es funktioniert einfach nicht:
    Code:
    SELECT ID,id_cat FROM {$CONFIG['tpe']}daten HAVING INSTR(id_cat,'{$this->rec}')
    Code:
    SELECT ID,id_cat FROM {$CONFIG['tpe']}daten WHERE id_cat LIKE '%{$this->rec}%'
    Code:
    SELECT ID,id_cat FROM {$CONFIG['tpe']}daten HAVING INSTR(id_cat,'{$this->rec}',1)>0
    und sogar
    Code:
    SELECT ID,id_cat FROM {$CONFIG['tpe']}daten WHERE CONCAT_WS(',',id_cat)={$this->rec}
    und
    Code:
    SELECT ID,id_cat FROM {$CONFIG['tpe']}daten WHERE MATCH(id_cat) AGAINST({$this->rec} IN BOOLEAN MODE)
    das muss doch irgendwie gehen?
    ich bin euch super dankbar für hilfe!
    (ps. {$CONFIG['tpe']} ist für globale einstellungen - wird in diesem fall mit "tabelle_" überschrieben und in {$this->rec} steht die zu findende zahl also 2 oder 4 oder 200 oder 132)
    Zuletzt geändert von kendor; 07.02.2008, 01:02.

  • #2
    Ja, normalisieren, d.h. aus id_cat eine eigene Tabelle machen und dann die id_cat-Spalte in die Tonne klopfen.

    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
    Wie man Fragen richtig stellt

    Kommentar


    • #3
      hey ghostgambler

      das klingt ja ganz verlockend einfach. nur habe ich keinen plan was du meinst was ich jetzt machen soll... gibt es denn mysql anweisungen die das direkt machen können?

      ich wäre sehr froh für ein kleines code snippet oder so denn wenn ich nach datenbanknormalisierung suche komme ich zu "JOINS&Co" und alles andere als zur suche und vorallem SELECTion in serialisierten daten. danke

      vorallem gehts mir ja darum die ID's herauszufinden, in denen in der zeile id_cat bestimmte werte vorkommen. wenn ich im netz suche, erhalte ich immer dasselbe resultat: SELECT * FROM ... WHERE ... LIKE ... aber genau das funktioniert ja bei mir nicht.
      muss ich die werte in id_cat irgendwie noch wandeln? mmh :S
      Zuletzt geändert von kendor; 07.02.2008, 10:50.

      Kommentar


      • #4
        Das wäre dann die Abfrage:
        PHP-Code:
        $sql "SELECT
                id
            FROM "
                
        $CONFIG['tpe'] . "daten AS d
            INNER JOIN
                cat AS c ON d.id = c.datenId
            WHERE
                c.catId = 
        $this->rec"
        Gruss
        H2O

        Kommentar


        • #5
          sdanke - aber leider funktioniert auch das nicht... :S
          also vielleicht hab ich dein query falsch interpretiert (oder du meine tabelle).
          bin etwas begriffsstutzig im moment wohl...

          also nochmal zum problem:

          ich habe folgende tabellen:
          Code:
          daten:
          +-----------------+----------------------+------+-----+
          | ID	| id_cat  | start 		 | stop | ... |
          +-----------------+----------------------+------+-----+
          | 1	| 2,3,1	  | 2000-12-12 12:32:09  | ...  |     |
          | 2	| 5,3	  | 2123-12-12 12:34:09  | ...  |     |
          | 3	| 1 	  | 2234-12-12 12:35:09  | .	|
          | 4	| 1,3,5,6 | 2345-12-12 12:36:09  | .  	|  
          | 5	| 2,4	  | 2456-12-12 12:37:09  | .  	|  
          | 6	| 6	  | 2567-12-12 12:38:09  |  	|
          +-------+---------+----------------------+------+---
          
          cat:
          +--------+----------+---------+-----+
          | id_cat | subofcat | Name    | ... |
          +--------+----------+---------+-----+
          | 1 	 | 0	    | kateg1  | ...
          | 2      | 1 	    | kateg12 | ..
          | 3 	 | 1	    | kateg13 | .
          | 4      | 5 	    | kateg51 | .
          | 5 	 | 0	    | kateg5  | 
          | 6      | 5 	    | kateg52 | 
          +--------+----------+---------+---
          und ich will jetzt alle einträge aus der tabelle "daten" in denen bei id_cat ein bestimmter wert vorkommt.

          beispiel:
          ich will alle einträge (daten.ID) die zur kategorie "kateg1" gehören (id_cat=1)
          das würde mir als resultat für ID folgende werte geben: 1,3,4

          versucht habe ich das mit all den obigen queries und dem hier:
          könnt ihr mir helfen? vielen dank!
          PHP-Code:
          $trigger_query="SELECT ID FROM "$CONFIG['tpe'] . "daten AS d 
                              INNER JOIN "
          $CONFIG['tpe'] . "cat AS c ON d.id_cat = c.id_cat 
                              WHERE c.id_cat = 
          {$this->rec}"
          Zuletzt geändert von kendor; 07.02.2008, 12:10.

          Kommentar


          • #6
            Da brauchst du eine neue Beziehungstabelle:
            Code:
            daten_cat
            +---------+----------+
            | id_daten | id_cat   |
            +---------+----------+
            | 1        | 1        |
            | 1        | 2        |
            | 1        | 3        |
            | 2        | 3        |
            | 2        | 5        |
            | 3        | 1        |
            | 4        | 1        |
            | 4        | 3        |
            | 4        | 5        |
            | 4        | 6        |
            | 5        | 2        |
            | 5        | 4        |
            | 6        | 6        |
            +---------+----------+
            Für jede mögliche Daten-Cat-Beziehung gibt es darin einen Eintrag. Dafür kannst du dann das Attribut id_cat aus der Daten-Tabelle löschen. Und wenn du die Cat-Bezeichnung als Paramter hast, geht es natürlich statt dessen über alle drei Tabellen, z.B.:
            PHP-Code:
            $trigger_query "SELECT 
                                ID 
                            FROM 
                                " 
            $CONFIG['tpe'] . "daten AS d 
                            INNER JOIN 
                                " 
            $CONFIG['tpe'] . "daten_cat dc AS c ON d.id = dc.id_daten
                            INNER JOIN 
                                " 
            $CONFIG['tpe'] . "cat AS c USING(id_cat)
                            WHERE 
                                c.name = '
            $this->rec'"
            Gruss
            H2O

            Kommentar


            • #7
              sehr gut danke... super board!

              nun, wie kann ich denn aus der bestehenden tabelle eine solche neue beziehungstabelle generieren? resp. das problem ist, dass ich auf die daten tabelle keinen einfluss habe, denn die wird von einem externen script so gefüllt :S

              ich müsste also irgendwie jedes mal, wenn die datentabelle geändert wird (neuer eintrag oder update) die beziehungstabelle daten_cat auch auktualisieren können. gibts ideen dazu?

              Kommentar


              • #8
                Original geschrieben von kendor
                ... denn die wird von einem externen script so gefüllt :S

                ich müsste also irgendwie jedes mal, wenn die datentabelle geändert wird (neuer eintrag oder update) die beziehungstabelle daten_cat auch auktualisieren können.
                Wer kommt denn auf so hirnverbrannte Ideen. Da bleibt dir wohl nicht viel anderes übrig. Hier mal eine Skizze, wie su eine Aktualisierung stattfinden könnte:
                PHP-Code:
                $sql "TRUNCATE TABLE daten_cat";   // Tabelle leeren
                mysql_query($sql) || die(mysql_error());
                $sql "SELECT
                            id, id_cat
                        FROM
                            daten"
                ;
                $inserts = array();
                mysql_query($sql) || die(mysql_error());
                while(
                $obj mysql_fetch_object){
                    
                $dId $obj->id;
                    
                $cIds explode(','$obj->id_cat);
                    foreach(
                $cIds as $cId){
                        
                $inserts[] = "($dId$cId)";
                    }
                }
                $sql "INSERT INTO daten_cat(id_daten, id_cat)
                        VALUES " 
                implode(', '$inserts);    // Daten neu einfügen
                // echo "$sql<br />";
                mysql_query($sql) || die(mysql_error()); 
                Falls deine Tabellen vom Typ InnoDB sind, würde ich das Ganze noch in eine Transaktion setzen.
                Gruss
                H2O

                Kommentar


                • #9
                  spitze! vielen herzlichen dank dir!!
                  werd ich mal so versuchen. stark!
                  gruss kendor

                  Kommentar


                  • #10
                    Grundsätzlich gern geschehen. Wenn ich allerdings vorher auf deine Crosspostings gestossen wäre ...
                    Gruss
                    H2O

                    Kommentar


                    • #11
                      tut mir echt leid, das war dumm von mir.

                      Kommentar

                      Lädt...
                      X