SQL, PHP Получить общее количество при подкачке до sqlsrv_fetch_array - PullRequest
1 голос
/ 23 марта 2020

Я нашел хороший запрос, который подсчитывает общее количество во время подкачки:

    DECLARE
        @PageSize INT = 15,
        @PageNum  INT = '.$page_num.';

    WITH TempResult AS(
        SELECT *
        FROM V_Item_Voice
    ), TempCount AS (
        SELECT COUNT(*) AS MaxRows FROM TempResult
    )
    SELECT *
    FROM TempResult, TempCount
    ORDER BY TempResult.ItemNum
        OFFSET (@PageNum-1)*@PageSize ROWS
        FETCH NEXT @PageSize ROWS ONLY

Из этого запроса я могу получить еще одну дополнительную строку MaxRows, которая показывает общее количество. Таблица выглядит следующим образом:

---------------------
id | name  | MaxRows
---------------------
1  | demo2 | 95
---------------------
2  | demo2 | 95
---------------------

Затем, чтобы получить ее в PHP, я делаю это:

$result = sqlsrv_query($connection, $query);
while($row = sqlsrv_fetch_array($result)){}

Я не знаю, как можно получить общий итог результат (который равен MaxRows) перед тем, как сделать l oop. Или я должен получить это внутри l oop? Кто-нибудь может показать мне. Спасибо.

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

Предполагается, что у вас есть хотя бы одно поле PK:

SELECT colID, col1, col2, ... 1 AS RowCount FROM myTable OFFSET ...
UNION ALL
SELECT NULL, NULL, NULL, ... COUNT(*) AS RowCount FROM myTable

Запись, в которой столбец ID / PK имеет значение NULL, представляет собой ваш общий счет, остальная часть - ваша страница.

Или, если вы хотите, чтобы количество строк отображалось как отдельный столбец, вы можете сделать

SELECT
  SRC.colID, SRC.col1, SRC.col2, ... , RC.RowCount
FROM
  (
    SELECT colID, col1, col2, ... 1 AS RowCount FROM myTable OFFSET ...
  ) AS SRC
  CROSS JOIN
  (
    SELECT COUNT(*) AS RowCount FROM myTable
  ) AS RC
0 голосов
/ 23 марта 2020

Один из возможных подходов - создать два отдельных оператора, но выполнить их одним вызовом sqlsrv_query(). В этой ситуации первый набор результатов будет возвращать количество строк, а второй - фактические данные.

С драйвером PHP для SQL Сервер вы можете легко получать данные из разных наборов результатов, используя sqlsrv_next_result(). Также используйте параметры для подкачки. Функция sqlsrv_query() выполняет подготовку операторов и их выполнение и может использоваться для выполнения параметризованных запросов:

Пример (на основе вашего кода):

<?php
// Connection
$servername = "server\instance,port";
$cinfo = array(
    "UID" => 'username',
    "PWD" => 'password',
    "Database" => 'database'
);
$conn = sqlsrv_connect($servername, $cinfo);
if ($conn === false) {
    die(print_r( sqlsrv_errors(), true));
}

// Statement
$pageSize = 15;
$pageNum = 1;
$query = "
    SELECT COUNT(*) AS MaxRows 
    FROM V_Item_Voice;

    SELECT *
    FROM V_Item_Voice
    ORDER BY ItemNum
        OFFSET (? - 1) * ? ROWS
        FETCH NEXT ? ROWS ONLY;
";
$params = array($pageNum, $pageSize, $pageSize);
$stmt = sqlsrv_query($conn, $query, $params);
if ($stmt === false) {
    echo "Error";
    die(print_r(sqlsrv_errors(), true));
}

// First result set. Fetch row count
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
    echo "Row count: ".$row["MaxRows"]."<br>";
}

// Second resultset. Fetch actual data
if (sqlsrv_next_result($stmt) === false) {
    echo print_r(sqlsrv_errors(), true);
    exit;
}   
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
    echo $row["name"]."<br>";
}

// End
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>
...