#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()
агрегатную функцию. И как только вы это сделаете, вы сможете объединить несколько таких запросов с помощью aUNION
.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| ----- ----------- ----------- ------------