количество строк в одном запросе

#php

Вопрос:

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

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

PHP-код:

 $q1=$db-gt;query("SELECT id FROM edev_useri");  $q2=$db-gt;query("SELECT groupid FROM edev_useri WHERE groupid = 6");  $q3=$db-gt;query("SELECT groupid FROM edev_useri WHERE groupid = 7");  $q4=$db-gt;query("SELECT id FROM edev_cereri");  $useri = $db-gt;numRows($q1);  $dev = $db-gt;numRows($q2);  $ben = $db-gt;numRows($q3);  $cereri = $db-gt;numRows($q4);  $data=array();  $dashStats = array(  'useri' =gt; $useri,  'dev' =gt; $dev,  'ben' =gt; $ben,  'cereri' =gt; $cereri  );   $data[]=$dashStats;  $json_data = array('dashStats' =gt; $data);   echo json_encode($json_data);  

Комментарии:

1. Использование numRows не является хорошим подходом для начала (поскольку это все равно сначала помещает все записи в результирующий набор), вы должны писать запросы, возвращающие только одну запись, используя COUNT() агрегатную функцию. И как только вы это сделаете, вы сможете объединить несколько таких запросов с помощью a UNION .

2. Спасибо вам за ответ, well..as я говорю, что я новичок, и если бы вы могли привести мне пример, основанный на моем коде, было бы здорово, спасибо

3. Это не mysqli. Какой библиотекой вы пользуетесь?

4. Это mysqli, но у меня есть класс mysqli, в котором я пишу функции с желаемыми именами

5. Тогда вы спрашиваете не о mysqli, не так ли? В чем именно заключается ваш вопрос? Неясно, какого результата вы ожидаете.

Ответ №1:

Это некрасиво, и, возможно, вы могли бы сделать это лучше, но это делает свою работу.

непроверенный офк

 SELECT  (SELECT COUNT(*) FROM edev_useri) AS `useri`,  (SELECT COUNT(*) FROM edev_useri WHERE groupid = 6) AS `dev`,  (SELECT COUNT(*) FROM edev_useri WHERE groupid = 7) AS `ben`,  (SELECT COUNT(*) FROM edev_cereri) AS `cereri` ;  

Ответ №2:

Примечание: Немного неясно, в чем заключается реальная проблема, но из того, что я понял, речь идет о сведении этого только к одному SQL-запросу. Это означает, что для этого требуется другой запрос, поэтому в этом ответе говорится о способах выполнения этого в SQL. Как интерпретировать различные результаты в PHP, не рассматривается.

Вы можете использовать COUNT(*) (возвращая количество строк в виде одного значения) и UNION SELECT (позволяя объединять несколько SELECT строк в одну, если количество столбцов во всех из них одинаковое):

 SELECT COUNT(*) AS `count` FROM edev_useri UNION SELECT COUNT(*) FROM edev_useri WHERE groupid = 6 UNION SELECT COUNT(*) FROM edev_useri WHERE groupid = 7 UNION SELECT COUNT(*) FROM edev_cereri  

Тогда вы получите такой результат:

  -----  |count|  -----  | 1| | 2| | 3| | 4|  -----   

Или вы могли бы использовать SUM , чтобы посчитать все три вещи, связанные edev_useri с одним рядом:

 SELECT  COUNT(*) AS `count`,  COALESCE(SUM(groupid = 6), 0) AS `group6Count`  COALESCE(SUM(groupid = 7), 0) AS `group7Count` FROM edev_useri UNION SELECT COUNT(*), NULL, NULL FROM edev_cereri  

(Это работает, потому groupid = 6 что будет вычисляться 1 , когда условие истинно, поэтому SUM число всех этих 1 s будет равно количеству строк, соответствующих условию. Дополнительный COALESCE используется только для того, чтобы в случае, если все строки имеют groupid as NULL — или строк нет — результат все равно был 0 бы и нет NULL .)

Тогда вы получите такой результат:

  ----- ----------- -----------  |count|group6Count|group7Count|  ----- ----------- -----------  | 1| 2| 3| | 4| NULL| NULL|  ----- ----------- -----------   

Или, если вы предпочитаете, чтобы все это было в одной строке, вы можете выполнить 4-й пункт в качестве подзапроса:

 SELECT  COUNT(*) AS `userCount`,  COALESCE(SUM(groupid = 6), 0) AS `group6Count`,  COALESCE(SUM(groupid = 7), 0) AS `group7Count`,  (SELECT COUNT(*) FROM edev_cereri) AS `requestCount` FROM edev_useri  

Тогда вы получите такой результат:

  ----- ----------- ----------- ------------  |count|group6Count|group7Count|requestCount|  ----- ----------- ----------- ------------  | 1| 2| 3| 4|  ----- ----------- ----------- ------------