Problem mit query()



  • Hallo Leute
    Ich versuch die einzelnden Tabllen aus einer Datenbank

    show tables
    

    auszulesen und dann mit dem Namen

    select num from namedertabelle
    

    die Spalte num auszulesen was aber bei mir ab dem 2. Befehl zum Fehler führt:

    Commands out of sync; you can't run this command now
    

    hier mal der Quelltext:

    MYSQL_ROW database_row, table_row;
        MYSQL_RES *database_res, *table_res;
    
        mysql_query( sql, "show tables;");
        database_res = mysql_use_result( sql);
        check_error();
    
            while ((database_row = mysql_fetch_row( database_res)))
            {
                std::string query="select num from " + (std::string)database_row[0];
    
                mysql_query( sql, query.c_str() );
                table_res = mysql_use_result( sql);
                check_error();
    
                table_row = mysql_fetch_row( table_res);
    
                if( *table_row[0] == '1')
                {
                    g_list.push_back( ( std::string)database_row[0]);
                }
    
                mysql_free_result( table_res);
            }
    
        mysql_free_result( database_res);
    

    Gruß
    Gamebuntu



  • Achjeh, Doku lesen schadet nicht, nen

    http://dev.mysql.com/doc/refman/5.0/en/commands-out-of-sync.html

    Probier's mal mit mysql_store_result statt mysql_use_result für die "show tables" Abfrage.
    Und "select num" kommt mir komisch vor. Bei den SQL Servern die ich kenne heisst das "select count(*)".

    Die "if( *table_row[0] == '1')" ist auch ganz schlau. Die prüft (vermutlich) ob das Ergebnis mit ner Eins anfängt, nicht ob es gleich 1 ist.
    Vermutlich deswegen, weil ich von MySQL so-gut-wie keinen Plan habe.



  • Oh das hab ich noch gar nicht gesehen danke 😃
    Das num ist nur der Spaltenname.
    Ich überprüfe ob die Zelle 0 die 1 enthält.



  • gamebuntu schrieb:

    Das num ist nur der Spaltenname.

    Wenn alle Tabellen ne Spalte namens "num" haben, und du immer nur die 1. Zeile brauchst, dann OK.

    Ich überprüfe ob die Zelle 0 die 1 enthält.

    Dass deine Abfrage nur das 1. Zeichen des Feld-Wertes vergleicht ist dir klar, oder? Falls es das ist was du willst, OK.



  • Jop jede tabelle hat die spalte num.
    Aber ich habs jetzt geschickter gelöst :D.
    Habs jetzt so gemacht:

    select * from tabellenname where num = '1';
    


  • Ja, das ist vermutlich besser.
    Vor allem weil die "erste Zeile" ohne explizites "ORDER BY" einfach irgendeine ist.
    Wenn du nur wissen willst OB es eine Zeile gibt wo "num = '1'" gilt, könntest du es auch so machen

    -- Anzahl der Zeilen wo num = '1'
    SELECT COUNT(*) FROM tabname WHERE num = '1'
    
    -- Nur nachgucken ob es wenigstens eine Zeile mit num = '1' gibt
    SELECT 1 WHERE EXISTS (SELECT * FROM tabname WHERE num = '1')
    

    Mit deiner Version verglichen ist ersteres einfacher auszuwerten, und zweiteres kann bei grossen Tabellen deutlich schneller sein.



  • Ich möchte nur wissen ob die Tablle in Spalte num die 1 hat danach wird der Name der Tabelle in eine liste geschrieben.



  • Versteh ich nicht... "ob die Tablle in Spalte num die 1 hat" 😕
    Hast du pro Tabelle nur einen Datensatz oder wie?



  • Nene ich hab mehrere aber jede tabelle hat die Spalte num.



  • Ja, Tabellen hast du mehrere, das ist mir schon klar.

    Ich spreche von den ZEILEN in den Tabellen.
    Und jede ZEILE hat nen eigenen Wert für die Spalte "num".
    Die Frage ob in der Tabelle "X" in der Spalte "num" eine "1" drinnen steht, ist also nicht vollständig.

    Weil es in der Tabelle "X" viele viele Zeilen geben kann. Einigen könnten eine "1" in "num" stehen haben, andere nicht.



  • Doch doch die haben alle eine 1 oder eine 0 drin stehen.
    Das ist alles so programmiert das das so dort drin steht.



  • Kannst du wirklich garantieren, daß alle Zeilen der Tabelle den selben Wert in der Spalte "num" haben? Wenn ja, was für einen Sinn hat diese Spalte überhaupt?


Anmelden zum Antworten