逐步查询 MySQL 数据库 - 最佳方法?

Posted

技术标签:

【中文标题】逐步查询 MySQL 数据库 - 最佳方法?【英文标题】:Querying a MySQL database step by step - Best method? 【发布时间】:2011-01-03 18:16:22 【问题描述】:

我正在构建一个使用 php 5、mysql 5 和 javascript 以及 jQuery 和 AJAX 的 Web 应用程序。

该应用程序是一个相当复杂的选择过程,其中包含多个下拉菜单,用户可以按任意顺序从中进行选择。下拉菜单中的每个选择都会提供更多选择标准,这将限制其他下拉菜单中的选择,并最终提供有限的结果集。

我在客户端使用 Javascript,AJAX 连接到服务器上的 PHP 和 MySQL 数据库,其想法是每次用户从下拉列表中选择某些内容时,我都会发送一个 AJAX 请求来更新所有其他下拉列表。设置完所有可能的参数后,将显示结果集。

(出于各种原因,我确实希望将逻辑保留在服务器端,因此使用 AJAX。)

现在,我不确定为每个用户处理这个“迭代”过程的最佳方法是什么:

我有一个表,其中包含每个选择导致的所有条件。由于每个下拉选择都会产生一个集合,如果选择条件我可以在服务器上存储一个查询字符串,该查询字符串将被添加到每个选择中。然后我运行当前存储的查询字符串以找出每个下拉列表中应包含的内容,将该数据发送到客户端,然后存储查询以供稍后添加、运行、发送等更多条件时使用。 然后我必须为每个用户在服务器上存储该查询字符串,也许在一个文本文件中。或者也许作为一个存储过程,见下文....

另一种方法是在选择完成后使用新条件运行查询,发送数据以更新下拉列表,然后将选择存储在我运行下一个查询的临时表中等等。所以然后,临时表将缩小每个选择,直到我呈现结果。

该应用程序可以有多个用户同时工作,因此可能必须通过 cookie/会话 ID 以某种方式识别用户....(?)

并且存储的查询或临时表必须在每个用户离开一段时间后消失......如何?

添加越来越多的条件以从表格中进行选择的选择方法,允许进行复杂的选择计算:

使用连接

使用越来越受限的临时表,因为在添加新条件时会删除记录。

使用子选择。

在每个用户的每个步骤之间保持跟踪的存储方法:

将参数存储在服务器文件中,并将它们插入到每个选择步骤的 sql 或存储过程中,为每个步骤对整个数据库进行新查询,但每次都添加更多条件。

将 sql 查询存储在文件中,并为每个步骤扩展它....

将 sql 查询存储在表/字段中.....

将 sql 查询存储在存储过程中.....

将每个用户先前选择的实际有限结果集存储在一个临时表中,随着每个步骤删除的记录越来越多,该表将越来越小。

在会话期间将参数存储在客户端,每次选择时将它们全部重新发送到服务器

有人可以帮忙做这个决定吗?

Rgds 下午

【问题讨论】:

【参考方案1】:

我推荐的最佳方法是每次用户更改下拉框中的值时运行不同的查询。如果您有 5 个下拉框,当用户更改第一个框中的值时,您会从 AJAX 页面运行查询:

SELECT * FROM table WHERE val1 = x;

然后,一旦用户决定更改另一个值,您可以运行更窄的查询,例如

SELECT * FROM table WHERE val1 = x AND val2 = y;

然后您可以重复此过程,直到所有下拉框都已更改。

至于使用临时表或存储过程。我会说这对于您要实现的目标可能不是必需的,并且可能只是给项目增加了不必要的复杂性。

如果您知道需要从前端检查哪些字段,那么您应该只将下拉框中的选定值发送到 AJAX 页面,以便它可以决定需要运行什么查询并返回结果(XML/JSON 会很适合这个)。

【讨论】:

谢谢!认为我对自己来说太复杂了....只会跟踪在客户端使用/单击了哪些下拉菜单,然后在单击另一个下拉菜单时将这些内容发送到服务器端。然后服务器可以执行类似 SELECT * FROM table WHERE field1=param1 AND Field2=param2 等最多 15 个的操作。尚未解析的参数可以设置为通配符,这样我就可以一直使用相同的查询字符串(我猜?) ....

以上是关于逐步查询 MySQL 数据库 - 最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL性能优化的21个最佳实践

MySQL性能优化的最佳经验

MySQL性能优化的最佳经验

逐步深入:mysql删除重复数据

使用 PHP 在一个 MySQL 查询中获取多行的最佳方法是啥? [复制]

PHP/MySql - 使用嵌套对象查询对象的最佳方法