web-dev-qa-db-ja.com

ワイルドカードを使用してXXXで始まるすべての列を選択しますか?

私のデータベースには、似た名前の列がいくつかあります。どのように私はそれらが始まる単語に基づいてそれらを選択しますか?以下はテーブルレイアウトの例です。 enter image description here

特定の事柄(この例では食品の種類)のすべての情報を選択してみました

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

しかし、それはうまくいかなかったようです。

任意の助けいただければ幸いです:-)

編集:これは私の例からは明らかではなかったようですが、列の最初の単語はすべて知っています。列は常に同じで、「食品の種類」は追加または削除されません。PHP変数は、私が必要とするいくつかのセットの種類のどれを決定するためだけにあります。

24
Chris

あなたがしようとしていることを正確に行う方法はありません。最初に別のクエリを実行してすべての列名をフェッチし、次にそれらをPHPで処理して2番目のクエリを作成することもできますが、これはおそらく必要な名前を書き出すだけよりも複雑です。

または、このクエリを動的にする必要がある理由はありますか?テーブルの構造は頻繁に変更されますか?

8
Chad Birch

SQLを動的に構築する必要があります。開始点として、これにより、目的の列名が得られます。

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

これが純粋に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;

私の答えは この答え に触発されました。

注:私の 'inner-DBA'(私の肩に小さな天使の形で)は、これを行う必要があるのはおそらくDB構造が悪い兆候であると教えていますが、私の 'inner-DBA'ハッカー '(私のもう一方の肩に小さな悪魔の形で)は「ちょうどそれを成し遂げなさい!」と言います

6
Cato Minor

データベースを3列のデータベースに変換します。

Product_type (vegetable, fruit, etc) 

Name (Apple, carrot, etc) 

color (orange, yellow, etc)

これで、ワイルドカードを使用して特定のタイプのみを取得できるようになりました。これは、ヘッダーではなく列内にあるためです。

2
GB_

2ステップでクエリを作成するのはどうですか?

1- dbスキーマ(または他の場所)から列の名前を取得します

2-フィルター条件に一致する列の名前でSQLクエリを生成します。

1
The_Black_Smurf