2015-05-29 5 views
1

Мне нужно получить конкретные значения и подсчитать все значения из таблицы MySQL, мне нужно получить лучшую производительность, мой вопрос: что лучше и быстрее?PHP + Mysql Выбор и подсчет

- Использование два отдельные запросы:

$TBCount = $Resps = $MySQL->query('SELECT COUNT(*) FROM T1'); 
$Resps = $MySQL->query('SELECT id, name FROM T1 LIMIT 1'); 
while ($Resp = $Resps->fetch_assoc()) { 
    ... 
} 

- Используйте один запрос с двумя SELECT:

$Resps = $MySQL->query('SELECT id, name, (SELECT COUNT(*) FROM T1) AS count FROM T1 LIMIT 1'); 
while ($Resp = $Resps->fetch_assoc()) { 
    $TBCount = $Resp['count']; 
    ... 
} 

- Или кто-то есть какая-то лучшая идея?

В случае «одного запроса, два SELECT» в цикле «while», как я могу получить значение счета вне цикла? (чтобы избежать ненужной перезаписи переменной).

+0

Прежде всего, вы должны исправить свой синтаксис – Raptor

ответ

0

Взгляните на SQL_CALC_FOUND_ROWS. Он делает все, что вы хотите. Это даст вам общие результаты, даже если вы ограничиваете возвращаемые данные.

> SELECT SQL_CALC_FOUND_ROWS id, name FROM T1 LIMIT 1 
> SELECT FOUND_ROWS(); 
+0

Почему бы не привести пример кода? – Mike

+0

В запросе 'SELECT' я не принимаю все значения, фильтрует с помощью LIMIT и должен подсчитывать ВСЕ значения из таблицы. – Manux22

+0

Легкое исправление. Просто используйте имена столбцов вместо *. – iamdev

0
$Resps = $MySQL->query('SELECT id, name, (SELECT COUNT(*) as tot FROM T1) AS count FROM T1 LIMIT 1'); 
$Resp = $Resps->fetch_assoc() 
$TBCount = $Resp['tot']; 
mysqli_data_seek($Resps, 0); 

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

while ($Resp = $Resps->fetch_assoc()) { 
    //rest of your code 
    ... 
} 
+0

Да, но '$ Resps-> fetch_assoc()' перемещает указатель, а «while» начинает со второй строки ... – Manux22

+0

@ Manux22, да, вы правы :), но мы можем вернуть его в 0 позицию используя функцию 'mysqli_data_seek', проверьте отредактированный ответ моего –

+0

, который более эффективен, включая это в цикле? – Manux22

1

Предлагаю первый вариант с незначительными модификациями.

$TBCount = $Resps = $MySQL->query('SELECT COUNT(id) FROM T1'); 
$Resps = $MySQL->query('SELECT id, name FROM T1 LIMIT 1'); 
while ($Resp = $Resps->fetch_assoc()) { 
    ... 
} 

обратите внимание, что я упомянул только идентификатор в запросе счета, это может быть хорошим влияние на производительность при работе с большими данными.

Вы можете сделать то же самое во втором варианте, но в соответствии со вторым моментом моей мысли второй параметр даст счет во всей строке, возвращенной с основным запросом. И это значение будет одинаковым для всех строк, которые действительно не требуются.

Именно по этой причине я бы пошел с первым вариантом для отдельных запросов.