Объедините результаты поиска из разных таблиц в разделенных страницах - PullRequest
1 голос
/ 24 ноября 2010

У меня есть 3 объекта, и у каждого есть соответствующая таблица.У меня есть задача выполнить поиск в этих 3 таблицах, чтобы результаты отображались на одной странице и смешивались в соответствии с условиями сортировки.Я ищу правильное решение.У меня есть несколько идей.

Можно выполнить 3 поисковых запроса для каждой таблицы и затем показать результаты с учетом условий сортировки.Это просто, когда у меня есть результаты поиска все на одной странице.Когда мне нужно разделить результаты на страницы, я могу использовать следующий алгоритм: я запускаю те же 3 поисковых запроса и сохраняю идентификаторы строк результатов и имена таблиц в сеансе для текущего поиска в необходимом порядке сортировки.Я выполняю эти запросы только один раз в начале поиска.В соответствии с выбранной страницей я найду идентификаторы в сеансе и выполню 3 простых запроса, чтобы найти строки по их идентификаторам.

У вас есть идеи, как решить эту проблему лучше?Я делаю это на базе MySQL + PHP + Zend Framework.

1 Ответ

1 голос
/ 24 ноября 2010

Вот основной способ сделать это. В этом примере у каждой таблицы есть поля '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);
?>

Конечно, каждый из запросов должен быть адаптирован для отдельной таблицы. Обратите внимание, что я использовал аллогрит с пузырьковой сортировкой, в зависимости от ожидаемых результатов может быть лучше другой алгоритм сортировки.

Также может быть лучше объединить три запроса SELECT в один с помощью UNION (см. документацию ), но я недостаточно знаю структуру таблиц, чтобы сообщить вам запрос, который вы нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...