Php 在分页输出中统一来自不同表的搜索结果

Php 在分页输出中统一来自不同表的搜索结果,php,sql,algorithm,design-patterns,Php,Sql,Algorithm,Design Patterns,我有3个实体,每个实体都有一个对应的表。我有一个任务要在这3个表中搜索,所以结果将显示在一个页面上,根据排序条件混合在一起。我正在寻找一个合适的解决办法。我有一些想法 可以对每个表执行3次搜索查询,然后根据排序条件显示结果。当我把所有的搜索结果都放在一个页面上时,这很简单。当我需要将结果拆分为页面时,我可以使用以下算法:我运行相同的3个搜索查询,并在会话中以必要的排序顺序保存当前搜索的结果行ID和表名。我在搜索开始时只执行一次这些查询。 根据所选页面,我将在会话中查找ID,并执行3个简单查询,以

我有3个实体,每个实体都有一个对应的表。我有一个任务要在这3个表中搜索,所以结果将显示在一个页面上,根据排序条件混合在一起。我正在寻找一个合适的解决办法。我有一些想法

可以对每个表执行3次搜索查询,然后根据排序条件显示结果。当我把所有的搜索结果都放在一个页面上时,这很简单。当我需要将结果拆分为页面时,我可以使用以下算法:我运行相同的3个搜索查询,并在会话中以必要的排序顺序保存当前搜索的结果行ID和表名。我在搜索开始时只执行一次这些查询。 根据所选页面,我将在会话中查找ID,并执行3个简单查询,以根据ID查找行

你有没有办法更好地解决这个问题?
我是在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查询合并为一个查询可能更好,但我对表的结构了解不够,无法告诉您需要的查询。

是的,您对我的“不拆分到页面”结果的算法进行了相同的描述。我的任务更复杂,我在寻找不同的解决方法。啊,对不起,我误解了你的问题。在重读之后,我想不出比你现在拥有的更好的方法了。是的,你描述了我的算法,没有拆分到页面的结果。我的任务更复杂,我在寻找不同的解决方法。啊,对不起,我误解了你的问题。重读之后,我想不出比你现在拥有的更好的方法了。