私のデータベースには、似た名前の列がいくつかあります。どのように私はそれらが始まる単語に基づいてそれらを選択しますか?以下はテーブルレイアウトの例です。
特定の事柄(この例では食品の種類)のすべての情報を選択してみました
$Food = "Vegetable";
mysql_query("SELECT `" . $Food . " %` FROM `Foods`");
しかし、それはうまくいかなかったようです。
任意の助けいただければ幸いです:-)
編集:これは私の例からは明らかではなかったようですが、列の最初の単語はすべて知っています。列は常に同じで、「食品の種類」は追加または削除されません。PHP変数は、私が必要とするいくつかのセットの種類のどれを決定するためだけにあります。
あなたがしようとしていることを正確に行う方法はありません。最初に別のクエリを実行してすべての列名をフェッチし、次にそれらをPHPで処理して2番目のクエリを作成することもできますが、これはおそらく必要な名前を書き出すだけよりも複雑です。
または、このクエリを動的にする必要がある理由はありますか?テーブルの構造は頻繁に変更されますか?
SQLを動的に構築する必要があります。開始点として、これにより、目的の列名が得られます。
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'Foods'
AND table_schema = 'YourDB'
AND column_name LIKE 'Vegetable%'
これが純粋に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'ハッカー '(私のもう一方の肩に小さな悪魔の形で)は「ちょうどそれを成し遂げなさい!」と言います
データベースを3列のデータベースに変換します。
Product_type (vegetable, fruit, etc)
Name (Apple, carrot, etc)
color (orange, yellow, etc)
これで、ワイルドカードを使用して特定のタイプのみを取得できるようになりました。これは、ヘッダーではなく列内にあるためです。
2ステップでクエリを作成するのはどうですか?
1- dbスキーマ(または他の場所)から列の名前を取得します
2-フィルター条件に一致する列の名前でSQLクエリを生成します。