データベース構造を変更できないとします。あなたは、クエリを使用して、データベース内のテーブルのすべてのリストを取得することができます。
SHOW TABLES
次に、あなたが気に実験のためにあるどのテーブルかを知る必要があります。おそらく文字列のマッチングを行う必要があります。名前が "experiment_"か何かで始まったらうまくいけばいいでしょう。
次に、テーブル内のその遺伝子を探すSELECT文を実行します。最後に、実験名をテーブル名にマップして表示します。コードは次のようなものになるだろう:$ experiment_names、このすべての終わりに
$result = mysql_query("show tables");
$tables = array();
while ($row = mysql_fetch_array($result)) {
// Determine whether this is an experiment table.
if (preg_match("/^experiment_/", $row[0])) {
$tables[] = $row[0];
}
}
$tables_with_gene = array();
// As you can see, every search runs bunches of queries.
foreach ($tables as $table_name) {
$result = mysql_query("select gene_name from $table where gene_name = '$gene_name'");
if (mysql_num_rows($result)) {
$tables_with_gene[] = $table_name;
}
}
// Now you look up the experiment names
$experiment_names = array();
foreach ($tables_with_gene as $table_name) {
$result = mysql_query("select experiment_name from experiments where table_name = '$table_name'");
while ($row = mysql_fetch_array($result)) {
$experiment_names[] = $row[0];
}
}
問題の遺伝子が含まれる実験のリストを持っています。
遺伝子名がユーザー入力の場合は、まずSQLインジェクションを避けるためにサニタイズする必要があることに注意してください。
しかし、ええ、あなたはおそらくのようになります。1台欲しい:次に使用すると、1つのクエリでそれをすべて行うことができ
experiment_id
gene_name
gene_frequency
を:
SELECT e.experiment_name FROM experiment_data d JOIN experiments e
ON d.experiment_id = e.id
WHERE d.gene_name = 'your gene name'
これを行う最善の方法は、すべてのデータを1つのテーブルに格納して、実験の識別子を付けることです。また、PHPやASPを使用しますが、両方の広告を使用するのではなく、両方を混在させることはメンテナンスの悪夢となります。 – Wrikken
"...たくさんのテーブルが含まれています...それぞれが同じ一般的なフォーマットに従っています..."私はおそらくあなたの範囲外ですが、これは適切な正規化による再設計のために叫ぶデータベースです。 –
迅速な対応をありがとう!しかし、大部分の遺伝子は複数の実験に関与している。また、我々は約28,000の遺伝子を検討している。それを念頭に置いて、他に提案はありますか? – user845454