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

Php 需要帮助:如何设计我的网页,从数据库排序数据?,php,javascript,mysql,html,sql,Php,Javascript,Mysql,Html,Sql,我为这个冗长的问题提前道歉。我正在为一个DNA研究实验室设计一个网页,我被困在一个特别的问题上。该网页访问单个MySQL数据库,但该数据库包含数十个表。每个表对应一个实验。每个表格都遵循相同的通用格式:一列列出DNA基因名称,下一列显示存在的DNA基因数量。然而,每个表包含一组不同的基因(一个实验中的基因并不总是与另一个实验中的基因相同) 在这一点上,我希望用户输入他感兴趣的基因,然后网页将显示哪些实验有该基因的数据。基本上,我需要弄清楚数据库中哪些MySQL表具有我想要的数据 在我看来,我需要

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

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

在我看来,我需要遍历MySQL数据库中的每个表,并对每个表执行SELECTWHERE查询。如果它返回了一些东西,那么它就是我想要的表,我将把表名添加到数组中。如果没有,我就转到下一张桌子


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

听起来您可能需要重新设计数据库?我认为您只需要一个表,当前用于区分表的“基因集”应该是该表上的非唯一键


然后,您应该能够查询单个表,其中基因集等于您要查找的集…

因为您计划使用PHP,所以这是执行所需逻辑的一个好选择


你能控制数据库的结构吗?如果这样做,则可能更容易重新构造数据库本身以支持所需的查询类型。例如,您可以有一个表列出实验,另一个表列出基因,第三个表将实验与基因和其他数据连接起来。这将避免所有必须在表中搜索的数据。这样做的好处是,随着更多实验的添加,应用程序将在不修改PHP代码的情况下继续工作。

假设您无法更改数据库结构。您可以使用以下查询获取数据库中所有表的列表:

SHOW TABLES
接下来,您需要知道哪些表是您关心的实验用表。您可能需要进行某种类型的字符串匹配——希望它们的名称以“experience_”或其他什么开头

然后运行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\u 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'

你真的应该考虑重新设计的人,如果可能的话。您的数据格式存在一些实际问题。如果不是这样做,你就不会有这个问题。从数据库的角度来看,28000条记录非常小,如果该基因参与了不止一个实验,这并不重要。这就是数据库中多个字段的全部意义所在。它们的目的是处理正是这种类型的数据。您只需要另一个字段来指示amount列中的数据所指的实验

所以不是

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

最好的方法是将所有数据存储在一个表中,并带有用于实验的标识符。此外,请使用PHP或ASP,但不要同时使用ad。就我而言,将它们混合在一起将是维护的噩梦。“…包含几十个表…每个表都遵循相同的通用格式…”我意识到这可能超出了您的范围,但这是一个需要重新设计并进行适当规范化的数据库。感谢您的快速响应!但是,大多数基因都涉及多个实验。此外,我们正在考虑约28000个基因。考虑到这一点,你还有其他建议吗?非常感谢雷夫。你的回答很有帮助。