Несколько COUNT(*) в одном часто выполняемом запросе - MySQL

  1. Приветствую! Существует такая проблема: есть таблица с ~30000 записей. В ней надо каждые несколько секунд считать количества записей с определенным набором параметров, состоящим из 2х столбцов: state и user. Притом вариантов state - 15, user - 20, а считаются только сегодняшние, максимум - позавчерашние, записи. В течение минуты обновляется информация примерно в 10 строках и добавляется около 5. Сейчас это делается запросом с 15 вложенными SELECT COUNT(*), который выполняется ~0,2 секунды. Собственно вопрос: как это можно оптимизировать?


textual

Код к задаче: «Несколько COUNT(*) в одном часто выполняемом запросе - MySQL»

SELECT ( SELECT COUNT(*) FROM `requests` WHERE (`date` = CURDATE() or `date` = '2017-09-12') and `del` <> 'hide' and ((`userID` = '' and (`state` = 'neobr' ) and  `state` <> 'brak') or (`userID` <> '' and `checkMoscow` = 'region' and state = 'neobr'))) as `allNeobr`,
(SELECT COUNT(*) FROM `requests` WHERE `state` = 'prihod' and `del` = '' and `rdate` = CURDATE()  and `requests`.`userID` = "" ) as `allPrihod`, 
(SELECT COUNT(*) FROM `requests` WHERE `state` IN('zapis', 'podtverjden') and `del` = '' and `rdate` = CURDATE()  and `requests`.`userID` = "" ) as `allZapis`,
(SELECT COUNT(*) FROM `requests` WHERE `state` = 'sliv' and `rdate` = CURDATE() and `del` = ''  and `requests`.`userID` = "" ) as `allSliv`,
(SELECT COUNT(*) FROM `balance_minus` WHERE `date` = CURDATE() and `money` = '400') as `allPartner`,
(SELECT COUNT(`requests`.`id`) FROM  `requests` INNER JOIN `crm_users_night` ON `requests`.`userID` =  `crm_users_night`.`ID` WHERE `crm_users_night`.`gorod`<>'Москва МО') as `allPartnerReg`,
(SELECT COUNT(*) FROM `requests` WHERE `state` = 'sozvon' and `rdate` = CURDATE() and `del` = ''  and `requests`.`userID` = "" ) as `allSozvon`,
(SELECT COUNT(*) FROM `requests` WHERE `state` = 'brak' and `date` = CURDATE() and `del` = ''  and `requests`.`userID` = "" ) as `allBrak`,
(SELECT COUNT(*) FROM `requests` WHERE `state` = 'nedozvon' and `date` = CURDATE() and `del` = ''  and `requests`.`userID` = "" ) as `allNedozvon`,
(SELECT COUNT(*) FROM `requests` WHERE `state` = 'bk' and `date` = CURDATE() and `del` = ''  and `requests`.`userID` = "" ) as `allBk`,
(SELECT COUNT(*) FROM `requests` WHERE `state` = 'vtorich' and `date` = CURDATE() and `del` = ''  and `requests`.`userID` = "" ) as `allVtorich`,
(SELECT COUNT(*) FROM `requests` WHERE `date` = CURDATE()    and `del` = '') as `allCount`

СДЕЛАЙТЕ РЕПОСТ

5   голосов, оценка 4.000 из 5



Похожие ответы
  1. Как правильно записать для того чтобы отнять от текущей даты цифру полученую с ячейки ... Я пробовал разными способами и всегда получал различного рода ошибки, один из примеров по которому должна быть понятной и сама задача ниже.

  1. Имеется 1. Таблица - table 2. Поля: - id; - pole_1; - pole_2; - pole_3; 3. Таблица содержит 9-ть записей. Можно ли обновить записи "pole_2" для "id" > 3 одним запросом? Или нужно для каждой записи делать отдельный запрос? Для id = 4My

  1. Как вывести несколько запросов в таблицу, при том что условие везде разное, с группировкой. PHPHTML1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 $sql  = $db->query("SELECT propiska_ter, COUNT(*) AS count FROM nabor_2015  GROUP BY propiska_ter"); $sql2 = $db->query("SELECT propiska_ter, COUNT(*) AS count2 FROM nabor_2015 WHERE forma='Очная'  GROUP BY propiska_ter");     echo '

    ';         echo '';              echo '';              echo '';       echo '';        while($result = $sql->fetch_assoc()) {          echo '';            echo '';            echo '';        echo '';    }   echo '
    Кол-во студентовОчная форма
    '.$result['count'].''.$result['count2'].'
    ';

  1. Всем привет, интересует такой вопрос: связал таблици по id через первичный ключ, теперь хочу в главную таблицу добавить инфу, но все падает. Добавляю таким запросом: insert into table(id1,id2,id3,id4) , valuec(25,36,9); id2 - внешний ключ другой таблицы, id3, id4 тоже. id - автоинкримент таблицы table

  1. Добрый день. Нужно вставить в таблицу oc_product_to_category в столбцы category_id, main_category, product_id значения category_id = 137 (постоянное), main_category = 0 (постоянное),product_id = мы выбираем из таблицы oc_product_option_value где option_value_id = 118 Т.е. category_id и main_category - всегда одинаковые, а product_id - уникальный номер, который меняется в каждой строке. [IMG=http://modamio.ru/asd.PNG][/IMG] Я пытался сделать это таким образом:

  1. В схеме БД существует связь между таблицами ВидыПолисов и Риски, когда ВидыПолисов имеет несколько ссылок на Риски. Как вывести ВидыПолисов с наименованиями Рисков? Были варианты:

  1. Доброе время, уважаемые форумчане. У меня возникла не большая проблема, над которой я бьюсь уже несколько часов.PHP1 2 3 $date_s=$_GET['filter_date_start']; $date_e=$_GET['filter_date_end']; $sql=mysql_query("SELECT * FROM 'news' WHERE  AND 'date_added' BETWEEN '$date_s' AND '$date_e' ");Есть такой вот код, вроде все понятно. Что есть две входящие перменные, дата, с такого то числа по такое. И этот запрос прекрасно работает, но необходимо еще одно условие типа PHP1 WHERE moder_status_id='5'то есть, вывод только промодерированных статей. Проблема в том, что когда я строю конструкцию типаPHP1 $sql=mysql_query("SELECT * FROM 'news' WHERE  AND 'date_added' BETWEEN '$date_s' AND '$date_e' AND  moder_status_id='5' ");Код просто отказывается работать, поставить OR не получится, тогда он не сортирует по датам, а просто выкладывает все промодерированные статьи. Помогите пожайлусто. Искал в поиске, в инете, похожих проблем нет((

  1. Привет) В общем, запутался в трёх соснах. Куча ответов в гугле, но реально что-то ни один не работает..( Есть таблица: логин и id_ref_user (id того, кто привёл на сайт (рефовода)) В итоге, нужно посчитать, сколько у каждого человека своих рефералов. Уже вариантов 15 перебрал, например так:PHP1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $link = mysql_connect($host,$user,$pass); mysql_select_db($db,$link); $result = mysql_query("            SELECT count(id_ref_user) as w, login     FROM user        WHERE id_ref_user !='0' //исключаем тех, кто сам пришёл        GROUP BY login        ORDER BY w ");   while ($row = mysql_fetch_array($result)) {     echo $row['login'] . '=>' . $row['w'] . "
    "; }Но так не получается.. Как сделать правильно? В чём ошибка?