-% serve solo come carattere per separare i valori, va bene qualsiasi altro carattere
Se nella base di dati c'è almeno una colonna di tipo CHAR, VARCHAR o altri tipi testuali, questa strategia non ha garanzia di funzionare correttamente: qualunque sia il carattere che usi come separatore, esso potrebbe essere presente del testo di un campo.
Ciò detto, puoi interrogare la base di dati richiedendo tutti i campi di tutte le righe, creare un vettore che contenga un vettore per ciascuna riga (ogni vettore contiene le colonne), e "trasporre" la matrice così ottenuta. In pseudocodice:
Codice PHP:
// Genera un vettore che contiene i valori della colonna $field
function project($table, $field) {
$column = [];
foreach ($table as $row) {
$column[] = $row[$field];
}
return $column;
}
// Recupera la tabella dalla base di dati
$query = "SELECT * FROM my_table";
$result = mysqli->query($query);
// Copia la tabella in un vettore
$table = array();
while ($row = $result->fetch_assoc()) {
$table[] = $row;
}
// Se la tabella era vuota, non servono altre operazioni
if (empty($table)) {
// ... gestione della situazione (eccezione? Return?)
}
// Per ogni colonna, costruisce il vettore che contiene tutti gli elementi di quella colonna nella tabella (proiezione)
$fields = array_keys(current($table));
$transposed = array();
foreach ($fields as $field) {
$transposed[$field] = project($table, $field);
}
// Per ogni colonna, "fonde" i valori in un'unica stringa, separandoli con '%'
$values = array();
foreach ($transposed as $field => $column) {
$values[$field] = implode('%', $column)
}
// $values['nome_della_colonna'] contiene il valore richiesto
Non è testato e può contenere errori di sintassi. Il costo è di un'interrogazione alla base di dati, O(n) per copiare i dati in $table, O(m * n) per la "trasposizione" e O(m * costo-di-una-implode) < O(m * n) per schierare i valori in una stringa (n numero di righe, m di colonne). Il costo in termini di spazio è pari alla dimensione della tabella, più un sovrapprezzo trascurabile per le variabili coinvolte.