如何使用MySQL结果集对外部API进行组合,分页和排序

时间:2011-07-27 00:47:54

标签: php mysql web-services api pagination

我正在寻找一种有效的方法将REST API的结果与查询结果结合到托管的MySQL数据库中。我需要能够对结果进行分页和排序,但是我无法确定最佳方法,以便保持记录的顺序。我正在使用PHP和Curl向服务发送休息请求。

我使用的外部API是多事的(http://api.eventful.com/),我的MySQL数据库存储的事件信息基本相同。我想从这两个来源中获取,排序并启用分页。

即 在这个例子中,我们有一个LIMIT为4,但有些记录可能来自eventful,而其他记录可能来自MySQL,具体取决于日期。我认为您需要保留API和MySQL结果的偏移量,并将它们减少每个页面中使用的记录数。但是,除非我从两个来源中提取所有记录,否则我不知道如何排序。

事件名称/日期/来源(E =多事,M = MySQL)

| page_num 1  | page_num 2  | page_num 3   |
|:-----------:|------------:|:------------:|
|  A|7/27|E   |  E|7/31|E   |  I|8/04|M    |
|  B|7/28|M   |  F|8/01|M   |  J|8/05|M    |
|  C|7/29|E   |  G|8/02|M   |  K|8/06|E    |
|  D|7/30|M   |  H|8/03|E   |  L|8/07|E    |

2 个答案:

答案 0 :(得分:1)

如果无法在数据库中存储数据,则必须在PHP中进行合并和排序。

以下是一个示例(CodePad),使用两个无序数组 - 每个数组都描述了您的数据源:

$mysql = array
(
    array('name' => 'I', 'date' => '20110804'),
    array('name' => 'J', 'date' => '20110805'),
    array('name' => 'F', 'date' => '20110801'),
    array('name' => 'D', 'date' => '20110730'),
    array('name' => 'B', 'date' => '20110728'),
    array('name' => 'G', 'date' => '20110802'),
);

$eventful = array
(
    array('name' => 'L', 'date' => '20110807'),
    array('name' => 'A', 'date' => '20110727'),
    array('name' => 'E', 'date' => '20110731'),
    array('name' => 'H', 'date' => '20110803'),
    array('name' => 'K', 'date' => '20110806'),
    array('name' => 'C', 'date' => '20110729'),
);

您需要选择要在每个数据源上显示的相等数量的最大事件,并将两个数组合并为一个多维数组,然后我们将使用array_multisort()对其进行排序:

$dates = array();
$result = array_merge($mysql, $eventful);

foreach ($result as $key => $value)
{
    $dates[$key] = $value['date'];
}

array_multisort($dates, SORT_ASC, $result);

然后$result变量将按升序排序:

Array
(
    [0] => Array
        (
            [name] => A
            [date] => 20110727
        )

    [1] => Array
        (
            [name] => B
            [date] => 20110728
        )

    [2] => Array
        (
            [name] => C
            [date] => 20110729
        )

    [3] => Array
        (
            [name] => D
            [date] => 20110730
        )

    [4] => Array
        (
            [name] => E
            [date] => 20110731
        )

    [5] => Array
        (
            [name] => F
            [date] => 20110801
        )

    [6] => Array
        (
            [name] => G
            [date] => 20110802
        )

    [7] => Array
        (
            [name] => H
            [date] => 20110803
        )

    [8] => Array
        (
            [name] => I
            [date] => 20110804
        )

    [9] => Array
        (
            [name] => J
            [date] => 20110805
        )

    [10] => Array
        (
            [name] => K
            [date] => 20110806
        )

    [11] => Array
        (
            [name] => L
            [date] => 20110807
        )
)

如果您需要降序,则可以改为使用SORT_DESC常量。

paginate 此数组,您只需使用array_chunk()

$result = array_chunk($result, 4); // 4 events per "page"

反过来,它产生一个具有附加维度的数组:

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [name] => A
                    [date] => 20110727
                )

            [1] => Array
                (
                    [name] => B
                    [date] => 20110728
                )

            [2] => Array
                (
                    [name] => C
                    [date] => 20110729
                )

            [3] => Array
                (
                    [name] => D
                    [date] => 20110730
                )
        )

    [1] => Array
        (
            [0] => Array
                (
                    [name] => E
                    [date] => 20110731
                )

            [1] => Array
                (
                    [name] => F
                    [date] => 20110801
                )

            [2] => Array
                (
                    [name] => G
                    [date] => 20110802
                )

            [3] => Array
                (
                    [name] => H
                    [date] => 20110803
                )
        )

    [2] => Array
        (
            [0] => Array
                (
                    [name] => I
                    [date] => 20110804
                )

            [1] => Array
                (
                    [name] => J
                    [date] => 20110805
                )

            [2] => Array
                (
                    [name] => K
                    [date] => 20110806
                )

            [3] => Array
                (
                    [name] => L
                    [date] => 20110807
                )
        )
)

请记住,这比典型的数据库排序和限制要低得多,主要是因为您将整个数据加载到内存中,甚至是那些活动“页面”不需要的数据。

我不确定你期望处理的数据量是多少,但是array_multisort()可以很好地执行几千条记录(我实际上从未将它用于任何更大的记录),如果你是寻找进一步的优化,你可以销毁分块数组的不需要的索引,或者使用array_slice()和一些算术来获取属于某个页面的四个特定记录。

尽管如此,如果你可以优化你的选择(可能有一些业务/日期逻辑,不确定),你可能会使整个排序+块(或切片)处理更多CPU和内存友好。

答案 1 :(得分:0)

如何从两个源中提取数据,将所有数据存储在数据库中,然后使用某些php查询该数据库以分页结果。