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

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

  • kendor
    antwortet
    tut mir echt leid, das war dumm von mir.

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


  • H2O
    antwortet
    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.

    Einen Kommentar schreiben:


  • kendor
    antwortet
    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?

    Einen Kommentar schreiben:


  • H2O
    antwortet
    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'"

    Einen Kommentar schreiben:


  • kendor
    antwortet
    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.

    Einen Kommentar schreiben:


  • H2O
    antwortet
    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"

    Einen Kommentar schreiben:


  • kendor
    antwortet
    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.

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


  • kendor
    hat ein Thema erstellt Select wo zahl in id (und id hat meherer zahlen).

    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.
Lädt...
X