web-dev-qa-db-fra.com

Vous sélectionnez toutes les colonnes commençant par XXX à l'aide d'un caractère générique?

J'ai plusieurs colonnes dans mes bases de données avec des noms similaires. Comment puis-je sélectionner ceux basés sur la Parole avec laquelle ils commencent? Voici un exemple de disposition de table: enter image description here

J'ai essayé de sélectionner toutes les informations pour une chose particulière (type de nourriture dans cet exemple) en utilisant

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

mais cela ne semblait pas fonctionner.

Toute aide serait appréciée :-)

EDIT: Apparemment, cela ne ressort pas clairement de mon exemple, mais je connais déjà les premiers mots de toutes les colonnes. Les colonnes sont toujours les mêmes et aucun "type de nourriture" n'est jamais ajouté ou supprimé. Le PHP n'est là que pour déterminer lequel des deux types d'ensemble dont j'ai besoin.

24
Chris

Il n'y a aucun moyen de faire exactement ce que vous essayez de faire. Vous pouvez d'abord faire une autre requête pour récupérer tous les noms de colonnes, puis les traiter dans PHP et créer la deuxième requête, mais c'est probablement plus complexe que de simplement écrire les noms que vous voulez.

Ou y a-t-il une raison pour laquelle cette requête doit être dynamique? La structure de la table changera-t-elle souvent?

8
Chad Birch

Vous devez construire le SQL dynamiquement. Comme point de départ, cela vous donnerait les noms de colonnes que vous recherchez.

SELECT COLUMN_NAME
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE table_name = 'Foods'
        AND table_schema = 'YourDB'
        AND column_name LIKE 'Vegetable%'
18
Joe Stefanelli

Voici une façon dont je l'ai fait uniquement avec 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;

Ma réponse est inspirée par cette réponse .

Remarque: Mon 'DBA interne' (sous la forme d'un petit ange sur mon épaule) me dit que le faire est probablement un signe de mauvaise structure de base de données, mais mon 'intérieur- hacker '(sous la forme d'un petit diable sur mon autre épaule) dit "faites-le!"

6
Cato Minor

Convertissez votre base de données en une à trois colonnes:

Product_type (vegetable, fruit, etc) 

Name (Apple, carrot, etc) 

color (orange, yellow, etc)

Vous pouvez maintenant utiliser votre caractère générique pour obtenir uniquement un certain type, car il se trouve désormais dans une colonne, et non dans l'en-tête.

2
GB_

Que diriez-vous de créer la requête en 2 étapes?

1- Récupérer le nom de la colonne depuis le schéma db (ou ailleurs)

2- Générez une requête SQL avec le nom de la colonne qui correspond à votre condition de filtre.

1
The_Black_Smurf