Ответы пользователя по тегу MySQL
  • Почему очень долго выполняеться запрос к БД?

    NikitaTratorov
    @NikitaTratorov
    CTO
    В свете Вышесказанного, если не менять логику и Вам необходимо получить все строки например, для вывода в CSV или Excel, сделать приблизительно следующее:
    //set_time_limit(120); // может понадобиться увеличить время выполнения
    $db_host = 'localhost';
    $db_user = 'root';
    $db_password = '';
    $db_name = 'price_sites';
      
    $linkps = mysqli_connect($db_host, $db_user, $db_password, $db_name);
    
    $limit = 1000;
    $offset = 0;
    // выполняем запрос с подсчетом общего числа результатов
    $query = sprintf("SELECT SQL_CALC_FOUND_ROWS * FROM table1 LEFT JOIN table2  USING(item) LIMIT %d,%d", $offset,$limit);
    $result = mysqli_query($linkps, $query);	
    
    // получаем общее число результатов
    $resultTotal = mysqli_query($linkps, "SELECT FOUND_ROWS() AS total");
    $res = mysqli_fetch_assoc($resultTotal);
    $numrows = $res['total'];
    
    // идем в цикле по результатам
    for ($offset = 0; $offset <= $numrows ; $offset += $limit) {
        // получаем строки из результата
        while ($row = mysqli_fetch_assoc($result)) {
            // Что-нибудь делаем с полученной строкой
            print_r($row);
        }
        //запрашиваем очередную порцию данных
        $query = sprintf("SELECT * FROM table1 LEFT JOIN table2  USING(item) LIMIT %d,%d", $offset,$limit);
        $result = mysqli_query($linkps, $query);	
    }

    Сразу говорю, что код может не заработать, ибо писал на память.
    Ответ написан
    Комментировать
  • Как составить запрос - сумма продаж за каждый день?

    NikitaTratorov
    @NikitaTratorov
    CTO
    Как описал Армянское Радио, обычно это делают так
    select sum(`объем`), DATE(`дата`) group by DATE(`дата`) from `таблица`

    но если в базе дата хранится в unix формате (числом), то вместо DATE() можете подставить DATE(UNIX_TIMESTAMP(`дата`))
    P.S. В select DATE() нужна, чтобы не вводить в заблуждение непонятным временем.
    Ответ написан
    Комментировать
  • Как перекрёстно сгрупировать выдачу через GROUP BY в MYSQL?

    NikitaTratorov
    @NikitaTratorov
    CTO
    Вы хотите невозможного. Думаю, что у Вас проблема в алгоритме или логике, поэтому и задача возникла. Подумайте еще.
    Что касается Вашего запроса, то подобная группировка уже не сработает на MySQL 5.7 из-за более строгих правил sql_mode.
    Вам никак не получить строку, которую Вы нарисовали, потому что text = Хорошо) написал не 3, а 1.
    Но уж если ооочень хочется, то переложите желаемую группировку на приложение, вычисляя, с кем разговаривал 1. Отстаньте от БД - сэкономите свое время и ресурсы СУБД.
    Или, я уже говорил - меняйте логику.
    Ответ написан
    Комментировать
  • Возможно ли работать совместно в mysql workbench community?

    NikitaTratorov
    @NikitaTratorov
    CTO
    Павел Михаловский Увы. Однако Navicat Data Modeler предоставляет облачный сервис Navicat Cloud. Возможно там Вы найдете требуемый функционал.
    Ответ написан
    Комментировать
  • Как выбрать данные из таблицы?

    NikitaTratorov
    @NikitaTratorov
    CTO
    Вопрос поставлен как-то странно, ибо у Вас в задании диапазон, а не конкретные даты.
    Другими словами, можно понимать, что Вы ищете строки, диапазоны которых пересекают 9й месяц 2016-го года.
    Значит получается, что начальная дата строки не должна превышать 2016-09-30, а конечная дата не должна быть раньше 2016-09-01. В упрощенном случае, когда дата начала в строке всегда меньше даты конца (если последняя не NULL), условие получится:
    ... WHERE (
    startdate <= '2016-09-30' AND 
    (enddate IS NULL OR (enddate IS NOT NULL AND enddate >='2016-09-01'))
    )

    IS NULL перенесено в начало, т.к. в другом порядке могут возникать проблемы.
    И Вам придется вычислять начальную и конечную дату выбранного месяца. Это можно делать при помощи php
    public static function last_day_of_month($date_str = null)
        {
            if (empty($date_str)) {
                return strtotime('23:59:59 last day of this month');
            } else {
                $d = new DateTime($date_str, new DateTimeZone(date_default_timezone_get()));
                return $d->format('t');
            }
        }
    
        public static function first_day_of_month($timestamp = null)
        {
            if (empty($timestamp))
                return strtotime('00:00:00 first day of this month');
            else
                return strtotime('00:00:00 first day of this month', $timestamp);
        }
    Ответ написан