Php 在分页输出中统一来自不同表的搜索结果
我有3个实体,每个实体都有一个对应的表。我有一个任务要在这3个表中搜索,所以结果将显示在一个页面上,根据排序条件混合在一起。我正在寻找一个合适的解决办法。我有一些想法 可以对每个表执行3次搜索查询,然后根据排序条件显示结果。当我把所有的搜索结果都放在一个页面上时,这很简单。当我需要将结果拆分为页面时,我可以使用以下算法:我运行相同的3个搜索查询,并在会话中以必要的排序顺序保存当前搜索的结果行ID和表名。我在搜索开始时只执行一次这些查询。 根据所选页面,我将在会话中查找ID,并执行3个简单查询,以根据ID查找行 你有没有办法更好地解决这个问题?Php 在分页输出中统一来自不同表的搜索结果,php,sql,algorithm,design-patterns,Php,Sql,Algorithm,Design Patterns,我有3个实体,每个实体都有一个对应的表。我有一个任务要在这3个表中搜索,所以结果将显示在一个页面上,根据排序条件混合在一起。我正在寻找一个合适的解决办法。我有一些想法 可以对每个表执行3次搜索查询,然后根据排序条件显示结果。当我把所有的搜索结果都放在一个页面上时,这很简单。当我需要将结果拆分为页面时,我可以使用以下算法:我运行相同的3个搜索查询,并在会话中以必要的排序顺序保存当前搜索的结果行ID和表名。我在搜索开始时只执行一次这些查询。 根据所选页面,我将在会话中查找ID,并执行3个简单查询,以
我是在MySQL+PHP+Zend框架基础上实现的。这里是一种基本的实现方法。对于本例,每个表都有一个“id”和一个“timestamp”字段,我们希望按timestamp字段对结果进行排序
<?
function bubblesort(array $items) {
// Sorts the items in a two-dimensional array based on a
// timestamp in the first field of the arrays passed.
do{
$flag = false;
for ($i = 0; $i < (count($items) - 1); $i++) {
if(strtotime($items[$i][0]) > strtotime($items[$i + 1][0])) {
$swap = $items[$i];
$items[$i] = $items[$i + 1];
$items[$i + 1] = $swap;
$flag = true;
}
}
}
while($flag);
return $items;
}
$results = array();
// Get results for the first table
$result = mysql_query("SELECT `timestamp`, `id` FROM `table1`;");
if (!$result)
die(mysql_error());
while ($row = mysql_fetch_array($result))
$results[] = array($row[0], $row[1]);
// Get results for the second table
$result = mysql_query("SELECT `timestamp`, `id` FROM `table2`;");
if (!$result)
die(mysql_error());
while ($row = mysql_fetch_array($result))
$results[] = array($row[0], $row[1]);
// Get results for the third table
$result = mysql_query("SELECT `timestamp`, `id` FROM `table3`;");
if (!$result)
die(mysql_error());
while ($row = mysql_fetch_array($result))
$results[] = array($row[0], $row[1]);
// Sort the joint results
$results = bubblesort($results);
?>
当然,每个查询都必须针对单个表进行调整。注意,我使用了冒泡排序算法,根据您期望的结果数量,不同的排序算法可能更好
使用UNION(请参阅)将三个SELECT查询合并为一个查询可能更好,但我对表的结构了解不够,无法告诉您所需的查询。以下是一种基本方法。对于本例,每个表都有一个“id”和一个“timestamp”字段,我们希望按timestamp字段对结果进行排序
<?
function bubblesort(array $items) {
// Sorts the items in a two-dimensional array based on a
// timestamp in the first field of the arrays passed.
do{
$flag = false;
for ($i = 0; $i < (count($items) - 1); $i++) {
if(strtotime($items[$i][0]) > strtotime($items[$i + 1][0])) {
$swap = $items[$i];
$items[$i] = $items[$i + 1];
$items[$i + 1] = $swap;
$flag = true;
}
}
}
while($flag);
return $items;
}
$results = array();
// Get results for the first table
$result = mysql_query("SELECT `timestamp`, `id` FROM `table1`;");
if (!$result)
die(mysql_error());
while ($row = mysql_fetch_array($result))
$results[] = array($row[0], $row[1]);
// Get results for the second table
$result = mysql_query("SELECT `timestamp`, `id` FROM `table2`;");
if (!$result)
die(mysql_error());
while ($row = mysql_fetch_array($result))
$results[] = array($row[0], $row[1]);
// Get results for the third table
$result = mysql_query("SELECT `timestamp`, `id` FROM `table3`;");
if (!$result)
die(mysql_error());
while ($row = mysql_fetch_array($result))
$results[] = array($row[0], $row[1]);
// Sort the joint results
$results = bubblesort($results);
?>
当然,每个查询都必须针对单个表进行调整。注意,我使用了冒泡排序算法,根据您期望的结果数量,不同的排序算法可能更好
使用UNION(请参阅)将三个SELECT查询合并为一个查询可能更好,但我对表的结构了解不够,无法告诉您需要的查询。是的,您对我的“不拆分到页面”结果的算法进行了相同的描述。我的任务更复杂,我在寻找不同的解决方法。啊,对不起,我误解了你的问题。在重读之后,我想不出比你现在拥有的更好的方法了。是的,你描述了我的算法,没有拆分到页面的结果。我的任务更复杂,我在寻找不同的解决方法。啊,对不起,我误解了你的问题。重读之后,我想不出比你现在拥有的更好的方法了。