2011-01-25 8 views
19

Ho diverse colonne nei miei database con nomi simili. Come seleziono quelli in base alla parola con cui iniziano? Ecco un esempio di layout tabella: enter image description hereSeleziona tutte le colonne che iniziano con XXX utilizzando un carattere jolly?

ho cercato la selezione per tutte le informazioni per una cosa particolare (tipo di cibo in questo esempio) usando

$Food = "Vegetable"; 
mysql_query("SELECT `" . $Food . " %` FROM `Foods`"); 

ma non sembrava funzionare.

Qualsiasi aiuto sarebbe apprezzato :-)

EDIT: A quanto pare questo non era chiaro dal mio esempio, ma so già le prime parole tutte di colonna. Le colonne sono sempre le stesse e nessun 'tipo di cibo' viene mai aggiunto o eliminato. La variabile PHP è lì solo per determinare quale dei due tipi di set ho bisogno.

+0

A parte il fatto che non riesco a immaginare un modo corretto per farlo, non è una grande idea per la stessa ragione per cui SELECT * non è una grande idea; se aggiungi/rimuovi colonne relative alla verdura, la tua query restituisce risultati imprevisti. –

+0

Penso che tutti qui abbiano capito la domanda. Quello che stiamo dicendo è che non sarà possibile creare tale query in una singola chiamata. Se conosci il nome di ogni colonna, esegui un ciclo in loro per trovare quello che inizia con il tuo prefisso e quindi genera dinamicamente un'istruzione SQL Select. –

+0

Ok, sono un po 'confuso dal fatto che i caratteri jolly non sono consentiti quando si selezionano i dati in base al nome della colonna. – Chris

risposta

5

Non c'è modo di fare esattamente quello che stai cercando. Puoi prima fare un'altra query per recuperare tutti i nomi delle colonne, quindi elaborarle in PHP e creare la seconda query, ma probabilmente è più complessa della semplice scrittura dei nomi che desideri.

Oppure c'è un motivo per cui questa query deve essere dinamica? La struttura del tavolo cambierà spesso?

+0

No, non cambierà mai, quindi non penso che sia molto complicato, tutto ciò di cui ho bisogno è il carattere jolly corretto per abbinare tutte le colonne di un certo tipo (= iniziando con una parola particolare, definita da una var di PHP). – Chris

+0

@Chris: Questo è quello che sto dicendo, non esiste un tale jolly. MySQL non supporta questo. Devi mettere '*' per tutte le colonne o definirle singolarmente. –

+0

Come dovrei definirli individualmente? Un collegamento ad un esempio sarebbe sufficiente:] – Chris

15

Dovresti creare lo SQL in modo dinamico. Come punto di partenza, otterresti i nomi delle colonne che stai cercando.

SELECT COLUMN_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE table_name = 'Foods' 
     AND table_schema = 'YourDB' 
     AND column_name LIKE 'Vegetable%' 
+0

Scusa, forse il mio esempio non era abbastanza chiaro, ma conosco già tutti i nomi delle colonne, rimarranno gli stessi. Sto solo cercando il carattere jolly giusto e un modo per usarlo. – Chris

+2

@Chris: non è possibile utilizzare un carattere jolly per l'elenco di colonne di un'istruzione select. L'SQL deve essere creato dinamicamente in modo che ogni nome di colonna sia esplicitamente referenziato nella selezione. –

+0

Ok, mi limiterò a definire individualmente le mie colonne, usando la variabile PHP in ogni nome che definisco :-) grazie – Chris

1

Come creare la query in 2 passaggi?

1- ottenere il nome della colonna dallo schema db (o altrove)

2- generare una query SQL con il nome della colonna che corrispondono alla vostra condizione di filtro.

+0

Conosco già i nomi della colonna, sto cercando aiuto per creare la query che corrisponda al colonne simili, di cui conosco già la prima parola. – Chris

2

convertire il database di una con tre colonne:

Product_type (vegetable, fruit, etc) 

Name (apple, carrot, etc) 

color (orange, yellow, etc) 

Ora è possibile utilizzare il carattere jolly per ottenere solo un certo tipo, perché ora è in una colonna, non nell'intestazione.

3

Ecco un modo ho fatto puramente con MySQL:

SET SESSION group_concat_max_len = 2048; 
SELECT GROUP_CONCAT(CONCAT(" ",CAST(column_name as CHAR(50)))) FROM information_schema.columns WHERE table_name='real_big_table' AND column_name LIKE 'prefix%' INTO @sub; 
SET @x = CONCAT("SELECT ",@sub," FROM my_db.real_big_table WHERE my_db.real_big_table.country_id='US'"); 
PREPARE stmt FROM @x; 
EXECUTE stmt; 

La mia risposta è ispirato this answer.

Nota: Il mio 'inner-DBA' (nella forma di un piccolo angelo sulla mia spalla) mi dice che doverlo fare è probabilmente un segno di una cattiva struttura del DB, ma il mio 'inner-hacker' (in la forma di un piccolo diavolo sull'altra mia spalla) dice "fallo e basta!"