2011-01-25 5 views
19

私のデータベースには、同様の名前の列がいくつかあります。 最初の単語に基づいてそれらを選択するにはどうすればよいですか? ここでは例のテーブルレイアウトです: enter image description hereワイルドカードを使用してXXXで始まるすべての列を選択しますか?

私は

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

を使用して、特定のもの(この例では、食品の一種)のためのすべての情報を選択しようとしたが、動作していないようでした。

すべてのヘルプは

EDIT :-)いただければ幸いです。どうやらこれは私の例からも明らかではなかったが、私はすでに、すべての列の最初の言葉を知っています。列は常に同じで、「食品の種類」は追加または削除されません。 PHP変数は、私が必要とするいくつかの種類のうちのどれを決定するためにのみ存在します。

+0

私はこれを行うための純粋な方法がないと考えることができるという事実を除いて、SELECT *が素晴らしいアイデアではないという同じ理由で素晴らしい考えではありません。野菜関連の列を追加/削除すると、予期しない結果が返されます。 –

+0

ここにいる皆さんが質問を理解したと思います。私たちが言っていることは、あなたが1回の呼び出しでこのようなクエリを作成することができなくなるということです。すべての列名を知っている場合は、oderでループして、どの列がプレフィックスで始まるかを調べ、SQL Select文を動的に生成します。 –

+0

これは、列名に基づいてデータを選択するときにワイルドカードを使用できないという混乱の種です。 – Chris

答えて

5

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

また、このクエリが動的である必要がある理由はありますか?テーブルの構造は頻繁に変わるでしょうか?

+0

これは決して変更されませんので、これは非常に複雑ではないと思います。特定の種類のすべての列(PHPのvarで定義された特定の単語から始まる)に一致するワイルドカードが必要です。 – Chris

+0

@Chris:そういうワイルドカードはありません。 MySQLはそれをサポートしていません。すべての列に '*'をつけるか、個々に定義する必要があります。 –

+0

個別に定義するにはどうすればよいですか?例にリンクすれば十分です:] – Chris

15

動的にSQLを構築する必要があります。出発点として、これはあなたが探している列名を取得します。

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

申し訳ありませんが、私の例が十分にはっきりしていないかもしれませんが、私はすでにすべての列名を知っています。私はちょうど正しいワイルドカード文字とそれを使用する方法を探しています。 – Chris

+2

@Chris:selectステートメントの列リストにワイルドカードを使用することはできません。各列名がselectで明示的に参照されるように、SQLを動的に構築する必要があります。 –

+0

わかりました。私は自分のカラムを個別に定義し、定義した各名前のPHP変数を使用します:-) thanks – Chris

1

2ステップでクエリを作成する方法はありますか?

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

2 - あなたのフィルタ条件に一致する列の名前を持つSQLクエリを生成します。

+0

私はすでにカラムの名前を知っています。私が既に最初の単語を知っている同様の列。 – Chris

2

は、3つの列で1にデータベースを変換します。それは今ではないヘッダーで、列にあるので

Product_type (vegetable, fruit, etc) 

Name (apple, carrot, etc) 

color (orange, yellow, etc) 

は今、あなたは、唯一の特定のタイプを取得するには、ワイルドカードを使用することができます。

3

ここで私は、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; 

私の答えはthis answerに触発されています。

注:私の肩の小さな天使の形の私の「内側のDBA」は、これを行う必要がDB構造の悪い兆候であると言いますが、私の「内部ハッカー」(私の他の肩に小さな悪魔の形)は、「ちょうどそれをやってください!」と言います。

関連する問題