我提前为长期问题道歉。我正在为DNA研究实验室设计一个网页,我被困在一个特定点上。该网页访问单个MySQL数据库,但该数据库包含许多表。每个表对应一个实验。每个表格都遵循相同的一般格式:一列列出DNA基因名称,下一列显示存在的DNA基因的数量。然而,每个表包含一组不同的基因(一个实验中的基因并不总是与另一个实验相同)。
此时,我希望用户输入他感兴趣的基因,然后网页将显示哪些实验有该基因的数据。基本上,我需要弄清楚数据库中哪些MySQL表具有我想要的数据。
我看到它的方式,我需要循环遍历MySQL数据库中的每个表,并对每个表执行SELECT WHERE查询。如果它返回一些东西,它是我想要的表,我将表名添加到数组中。如果没有,我就转到下一张桌子。
最好的方法是什么,我需要哪些语言?我将使用HTML和PHP作为网页,使用MySQL作为数据库查询。但是,我可以使用什么来循环表格?我在想javascript还是ASP?
答案 0 :(得分:3)
假设您无法更改数据库结构。您可以使用查询获取数据库中所有表的列表:
SHOW TABLES
接下来,您需要知道哪些表用于您关心的实验。您可能需要进行某种字符串匹配 - 希望它们的名称以“experiment_”或其他内容开头。
然后你只需运行一个SELECT语句来查找表中的那个基因。最后,您以某种方式将实验名称映射到表名称,并显示这些实验名称。代码类似于:
$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];
}
}
最后,$ experiment_names列出了包含相关基因的实验。
请注意,如果基因名称是用户输入,您首先要清理它以避免SQL注入。
但是,你可能想要一张看起来像的表:
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 :(得分:2)
听起来您可能需要重新设计数据库?我认为你只需要一个表,而当前区分表的“基因集”应该是该表上的一个非唯一键。
然后,您应该能够查询单个表格,基因集等于您要查找的集合......
答案 2 :(得分:0)
由于您计划使用PHP,因此这是执行所需逻辑的不错选择。
您是否可以控制数据库的结构?如果这样做,可能更容易重构数据库本身以支持您需要的查询类型。例如,您可以使用单个表列出实验,另一个表列出基因,第三个表将实验与基因连接起来,其他数据与之相关。这样可以避免在表中搜索您必须执行的数据。这样做的好处是,随着更多实验的添加,应用程序将继续工作而无需修改PHP代码。
答案 3 :(得分:0)
你应该考虑重新设计人们提到的,如果可能的话。您的数据格式存在一些实际问题。如果没有这样做你就不会有这个问题。数据库术语中28000条记录非常小,基因是否涉及多个实验并不重要。这真的是数据库中多个字段的重点。它们用于处理那种类型的数据。您只需要另一个字段,表示金额列中的数据所引用的实验。
所以而不是......
-----------------
| Gene | Amount |
-----------------
| abc | 123 |
| xyz | 789 |
-----------------
你有:
------------------------------
| Experiment | Gene | Amount |
------------------------------
| ex1 | abc | 123 |
| ex2 | abc | 456 |
| ex2 | xyz | 789 |
| ex1 | xyz | 058 |
------------------------------
等等等等
然后,如果您只需要查看来自ex1的数据:
SELECT *
FROM tblGeneData
WHERE Experiment = "ex1"
该查询将为您提供与以下相同的结果:
SELECT *
FROM tblExperiment1
这就是关系数据库的工作方式。它们通常不是为了将相同类型的数据保存在两个不同的表中,只是因为存在差异化属性。
修改强>
我觉得还需要指出,您通常还需要一个额外的字段作为表的唯一键。我会在表中添加一个名为“Id”的附加字段,并使其成为自动编号。您可以使用由数据组成的复合键,但普遍接受的“最佳实践”是在数据库内部工作的上下文之外使用单独的唯一键字段。该字段将用作表的主键。