2010-03-22 3 views
2

Я использую MVC с PHP/MySQL.MySQL: Получить только количество результатов

Предположим, что я использую 10 функций с различными запросами для получения сведений из базы данных.
Но в других случаях я могу получить только счет результата, который будет возвращен запросом.
Каков стандартный способ справиться с такой ситуацией.
Должен ли я написать еще 10 функций, которые дублируют почти весь запрос и возвращают только счет.
Или
Должен ли я всегда возвращать количество также в результате набор
Или
я могу передать флаг, чтобы указать, что функция должна возвращать счетчик только, а затем на основе флага я динамически генерировать (выбрать часть).
or
Есть ли лучший способ?

ответ

1

Если вы хотите, чтобы только количество строк соответствовало определенным критериям, вы не должны использовать счетчик результата, а другой запрос, который вместо этого выбирает только count (*).

Если вам нужны данные и их количество, почему бы вам просто не использовать count() для результирующего массива?

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

0

Обычно я старался иметь как можно больше кода, разделяемого между методами. Возможность будет:

  • имеет один select() и один count() функции
    • каждый один строит определенную часть запроса
  • и одна buildFromAndWhere() функции для построения части запроса которые являются общими.
    • и имеют select() и count() использование, что один


Написанный в псевдо-коде, это может выглядеть как-нибудь так:

function select($params) { 
    return "select * " 
      . from() 
      . where($params) 
      . "limit 0, 10"; 
} 

function count() { 
    return "count(*) as nbr " 
      . from() 
      . where(); 
} 

function from() { 
    return "from table1 inner join table1 on ... "; 
} 

function where($params) { 
    // Use $params to build the where clause 
    return "where X=Y and Z=blah"; 
} 

Таким образом, у вас есть как можно больше общего кода в функциях from() и where() - с учетом hard часть запросов часто присутствует, это к лучшему.


Я предпочитаю иметь две отдельные функции для выбора и подсчета; Я думаю, что код проще читать и понимать.

Мне не нравятся идеи одного метода, возвращающего два отдельных данных (список результатов и общее количество); и мне не очень нравится идея передачи флага: глядя на вызов функции, вы никогда не узнаете, что означает этот параметр.

1

Я пойду с идеей флага.

Написание еще 10 функций и копирование/вставка кода не помогают читать. Если вы всегда возвращаете счет, это означает, что всякий раз, когда вас интересует только счет, база данных все равно должна генерировать и передавать полный набор результатов, который может быть крайне неэффективным.

С флагом, вы бы что-то вроде

function getData($countOnly=false) { 
    // ...generate FROM and WHERE clause 
    if ($countOnly) { 
     $query = 'SELECT COUNT(*) '.$query; 
    } else { 
     $query = 'SELECT field1, field2, ...'.$query.' ORDER BY ...'; 
    } 
    ... 
} 
2

Теперь MySQL поддерживает вложенные запросы, вы можете получить отсчеты для любого запроса с помощью:

$count_query="SELECT COUNT(*) FROM ($query)"; 

Как трудно было?

Однако этот подход всегда означает, что вы выполняете два запроса вместо одного (я не уверен, что MySQL обязательно сможет использовать кешированный результирующий набор для подсчета - попробуйте его и посмотрите).

Если вы уже выбрали весь набор результатов, вероятно, будет быстрее подсчитывать строки в PHP, чем выдавать другой запрос.

Есть 2 функции в MySQL, которая будет возвращать количество совпадающих строк перед нанесением предельного заявления:

SQL_CALC_FOUND_ROWS и FOUND_ROWS()

см

http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows

C .

Смежные вопросы