Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di *Ray*
    Registrato dal
    Oct 2000
    Messaggi
    495

    Copiare una tupla cambiandone solo un valore + l'ID con 1 subquery

    Ho questo problema:

    Immaginate di avere una tupla come, ad esempio:

    codice:
    +------------+-------------+---------------+--------+
    | IDProdotto | IDCategoria | Descrizione   | Prezzo |
    +------------+-------------+---------------+--------+
    | 1          | 2           | Bla bla bla   | 5 euro |
    +------------+-------------+---------------+--------+
    Voglio creare una copia di questo prodotto nella categoria 3, cioe' voglio trovarmi in questa situazione:

    codice:
    +------------+-------------+---------------+--------+
    | IDProdotto | IDCategoria | Descrizione   | Prezzo |
    +------------+-------------+---------------+--------+
    | 1          | 2           | Bla bla bla   | 5 euro |
    | 2          | 3           | Bla bla bla   | 5 euro |
    +------------+-------------+---------------+--------+
    Avrei bisogno di farlo con una subquery unica. Come si fa in modo generale, cioe' senza sapere a priori i nomi delle colonne (a parte, ovviamente, quella da modificare)?

    A quanto ho capito, MySQL 4.1 non supporta le subquery del tipo:

    INSERT INTO .... WHERE (SELECT ....)

    Non ho ancora installato MySQL 4.1.7 per questioni varie, c'e' qualcuno che puo' confermare questo comportamento?

    A me sembra assurdo che per fare una operazione cosi' banale io mi debba incasinare la vita in PHP, anche perche' immaginate: come fare a capire quali dati hanno bisogno di apici e quali no? Rischio una sfilza di query di tipo getFieldType, una per ogni colonna.. un'assurdita'.

  2. #2
    Utente di HTML.it L'avatar di *Ray*
    Registrato dal
    Oct 2000
    Messaggi
    495
    Ah: aggiungo che forse si potrebbe fare con una view se proprio la subquery non funziona, ma se non ricordo male le view fino a MySQL 5.0 me le sogno, giusto?

  3. #3
    INSERT ... SELECT non e' una sub query ma un comando previsto in SQL99. deve riferirsi a due tabelle, cioe' non si puo' copiare e inserire nella stessa tabella.

    Per fare l'inserimento del tuo esempio devi fare due queries oppure inserire i valori separati da una virgola. Es.:
    codice:
    insert into tabella values
    ('','2','blablabla','5 euro') ,
    ('','3','blablabla','5 euro') ;
    puoi metterne fin che ne vuoi...

    Per le apici sui valori.... no problem, mettili sempre a tutti i valori che devi inserire, meno che alle funzioni o costanti ovviamente.


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  4. #4
    Utente di HTML.it L'avatar di *Ray*
    Registrato dal
    Oct 2000
    Messaggi
    495
    Penso che usero' una belle temporary table. Con quella dovrei risolvere ogni problema.

    PS: pensavo che i valori numerici non andassero fra apici.. non hai idea di quanto mi sono incasinato la vita per questa cosa. Grazie per la dritta.

  5. #5
    Originariamente inviato da *Ray*
    Penso che usero' una belle temporary table. Con quella dovrei risolvere ogni problema.

    PS: pensavo che i valori numerici non andassero fra apici.. non hai idea di quanto mi sono incasinato la vita per questa cosa. Grazie per la dritta.
    Sicuro di aver bisogno di una temporary table? Non è consentito fare un insert... select sulla stessa tabella?
    per favore NIENTE PVT TECNICI da sconosciuti

  6. #6
    Originariamente inviato da Fabio Heller
    Sicuro di aver bisogno di una temporary table? Non è consentito fare un insert... select sulla stessa tabella?
    The target table of the INSERT statement cannot appear in the FROM clause of the SELECT part of the query because it's forbidden in ANSI SQL to SELECT from the same table into which you are inserting. (The problem is that the SELECT possibly would find records that were inserted earlier during the same run. When using subselect clauses, the situation could easily be very confusing!)
    pare di no... pero' si puo' fare SELECT e poi INSERT


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  7. #7
    Utente di HTML.it L'avatar di *Ray*
    Registrato dal
    Oct 2000
    Messaggi
    495
    Si ma piero come faccio a fare select e poi insert separatamente? Devo cambiare dei dati..

  8. #8
    Originariamente inviato da *Ray*
    Si ma piero come faccio a fare select e poi insert separatamente? Devo cambiare dei dati..
    Estrai la tupla, e poi con un foreach ed una IF costruisci la query sostituendo il valore voluto.

    Un esempio.... non sai quanti campi ci siano ne l'ordine, pero' sai che devi cambiare il valore del campo IDCategoria.

    Dopo l'insert verifichi l'id immesso con mysql_insert_id. Ti fai la select * relativa e a questo punto potresti fare qualcosa di simile:
    codice:
    // nuovo valore
    $pippo = '3';
    
    $id1 = mysql_query($query1);       //SELECT ...
    $row = mysql_fetch_assoc($id1);    // devi usare mysql_fetch_assoc
    $num = mysql_num_fields($id1);     // conta il numero dei campi estratti
    
    // prepari la query per l'insert
    $query = "INSERT INTO tabella SET ";
    
    // fai un ciclo foreach
      foreach($row as $campo => $value ) {
    
          if($campo == 'IDCategoria') { $query .= " $campo = '$pippo', ";  }  // se il campo e' IDCategoria inserisce $pippo
    
              elseif($num == 1) { $query .= " $campo = '$value'";    }  //se il campo e' l'ultimo non mette la virgola al fondo
    
                 else { $query .= " $campo = '$value', ";    }  // altrimenti trasferisce i valori con la virgola separatrice.
    
       $num-- ;   // decrementa il numero dei campi...
    
     }  // fine foreach
    
    echo $query;     //  visualizza la query
    
    mysql_query($query);   // esegue la query INSERT
    Questo e' un modo spiccio e funzionale. Ovviamente non l'unico.

    Devi solo sapere il nome della tabella, del campo ed il valore che vuoi immettere. Che e' il minimo per qualunque modifica ....



    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  9. #9
    Utente di HTML.it L'avatar di *Ray*
    Registrato dal
    Oct 2000
    Messaggi
    495
    No.. e' assurdo passare dal linguaggio host secondo me. Meglio fare tutto in SQL.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.