2013-02-20 20 views
5

Ho una grande query MySQL SELECT, che ho bisogno di convertire in una sola stringa, così posso creare un UPDATE, senza dover usare due query separate . Per semplicità, supponiamo che abbiamo una query SELECT che restituisce questo risultato:MySQL SELEZIONA tutto in un'unica grande stringa (colonne e righe)

enter image description here

Come faccio a convertire tutto questo in qualcosa di simile a questo:

1,Bob,20;2,Adam,30;3,Steve,40; 

che posso usare AGGIORNARE qualche altro tavolo con?

Sapendo che il numero di colonne e righe può cambiare e non essere statico. (molto importante! Soprattutto le colonne!). Come posso farlo? Non credo che CONCAT() possa aiutare in questa situazione.

Qualsiasi aiuto sarebbe apprezzato. Grazie.

risposta

15

Puoi provare questo?

SELECT group_concat(concat(id, ',', name, ',', age) separator ';') 
FROM test 

http://www.sqlfiddle.com/#!2/915557/9

+1

Non riesco a scegliere concat perché le colonne possono cambiare e sono così lunghe. Ho bisogno di qualcosa che possa leggere automaticamente tutte le colonne da una query SELECT. Grazie. – Reacen

+0

Ah, mi dispiace per quello! Non riesco a pensare a nessun altro modo adesso. –

1

provare questo

SET @colnames := (SELECT GROUP_CONCAT(COLUMN_NAME, '\', \'') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'test' AND TABLE_SCHEMA = 'db'); 
SET @query := CONCAT('SELECT GROUP_CONCAT(', @colnames, 'SEPARATOR \';\') FROM test'); 
PREPARE STMT FROM @query; 
EXECUTE STMT; 
2

Se non siete alla ricerca di una query separata per eseguire questa operazione, questo può essere raggiunto da una query stessa. È possibile inserire in un'altra tabella e aggiornare una tabella in base a un risultato di selezione della query.

Supponendo che la tabella originale è table_from ed è necessario copiarlo in table_to (Si presuppone inoltre table_from contiene dati summenzionati originale),

Per inserire il contenuto in table_to da table_from,

insert into table_to(id, name, age) 
    select tf.id, tf.name, tf.age 
    from table_from tf 
    where tf.id != 3; 

Se si passa il numero esatto di colonne per la tabella è possibile omettere il nome delle colonne e solo passare i valori che nel tuo caso saranno utili.

insert into table_to 
    select tf.id, tf.name, tf.age 
    from table_from tf 
    where tf.id != 3; 

per aggiornare il contenuto di table_to da table_from,

update table_to tt, table_from tf 
    set tt.name = "Chandi" 
    where tt.id = tf.id and tf.id = 1; 

http://www.sqlfiddle.com/#!2/af43a/1

Problemi correlati