想要帮助:如何设计我的网页,从数据库中排序数据?

时间:2011-07-19 19:25:49

标签: php javascript mysql html sql

我提前为长期问题道歉。我正在为DNA研究实验室设计一个网页,我被困在一个特定点上。该网页访问单个MySQL数据库,但该数据库包含许多表。每个表对应一个实验。每个表格都遵循相同的一般格式:一列列出DNA基因名称,下一列显示存在的DNA基因的数量。然而,每个表包含一组不同的基因(一个实验中的基因并不总是与另一个实验相同)。

此时,我希望用户输入他感兴趣的基因,然后网页将显示哪些实验有该基因的数据。基本上,我需要弄清楚数据库中哪些MySQL表具有我想要的数据。

我看到它的方式,我需要循环遍历MySQL数据库中的每个表,并对每个表执行SELECT WHERE查询。如果它返回一些东西,它是我想要的表,我将表名添加到数组中。如果没有,我就转到下一张桌子。

最好的方法是什么,我需要哪些语言?我将使用HTML和PHP作为网页,使用MySQL作为数据库查询。但是,我可以使用什么来循环表格?我在想javascript还是ASP?

4 个答案:

答案 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”的附加字段,并使其成为自动编号。您可以使用由数据组成的复合键,但普遍接受的“最佳实践”是在数据库内部工作的上下文之外使用单独的唯一键字段。该字段将用作表的主键。