在页面拆分输出中联合来自不同表的搜索结果

时间:2010-11-24 15:15:41

标签: php sql algorithm design-patterns

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

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

您有什么想法如何更好地解决这个问题? 我是在MySQL + PHP + Zend框架基础上做的。

1 个答案:

答案 0 :(得分:1)

这是执行此操作的基本方法。对于此示例,每个表都有一个“id”和“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查询合并为一个也可能更好(参见the documentation),但我对表的结构知之甚少,无法告诉您需要的查询

相关问题