colshrapnel / safemysql

A real safe and convenient way to handle MySQL queries.
Apache License 2.0
395 stars 197 forks source link

Получить количество строк используя getAll #35

Closed TheImmortalLines closed 8 years ago

TheImmortalLines commented 8 years ago

Здравствуйте. Задача: получить количество строк с простым SELECT

Данную задачу я решил так:

        $res = $db->query('SELECT * FROM ?n', $table);
        while($row = $db->fetch($res)){
            $arResult['ITEMS'][] = $row;
        }
        $arResult['ITEMS_COUNT'] = $db->numRows($res);
        $db->free($res);

Хотелось бы решать в меньшее количество строк, типа:

        $arResult['ITEMS'] = $db->getAll('SELECT * FROM ?n', $table);
        $arResult['ITEMS_COUNT'] = $db->numRows();
colshrapnel commented 8 years ago

Если нужно только количество строк в таблице, то запрашивать надо только его.

    $arResult['ITEMS_COUNT'] = $db->getOne('SELECT count(*) FROM ?n', $table);

Если нужны и сами строки, и их количество, то непонятно, чем не устраивает

    $arResult['ITEMS'] = $db->getAll('SELECT * FROM ?n', $table);
    $arResult['ITEMS_COUNT'] = count($arResult['ITEMS']);
TheImmortalLines commented 8 years ago

Нужны и строки и их количество.

    $arResult['ITEMS'] = $db->getAll('SELECT * FROM ?n', $table);
    $arResult['ITEMS_COUNT'] = count($arResult['ITEMS']);

Соглашусь. Рабочий вариант.

Интуитивно, получить количество строк с помощью mysqli_num_rows казалось более правильно. Как вы считаете, какой вариант быстрее?

alexprey commented 8 years ago

Вопрос относится не совсем к библиотеке, но лично я использую два запроса

$collection->EntityArray = $db->getAll("SELECT * FROM table LIMIT ?i, ?i", $pageIndex * $pageSize, $pageSize);
$collection->TotalCount = $db->getOne("SELECT COUNT(id) FROM table")

На больших данных этот вариант работает быстрее, т.к. выбирается только часть данных из БД и полное кол-во получается только выборкой количества, запрос такой почти мгновенно проходит

colshrapnel commented 8 years ago

Мне нечего добавить к тому, что написал @alexprey

mysqli_num_rows действительно более интуитивный, но в корне неправильный способ. Запрашивать количество строк в таблице надо только у самой БД.

Если вдуматься, mysqli_num_rows - довольно бессмысленная функция. В принципе, узнавать у бд количество строк, которые она вернула, не нужно практически никогда.