Ответы пользователя по тегу MySQL
  • Как мне с одной базы с таблицы скопировать в другую базу таблицы?

    @alexalexes
    1. Используете импорт/экспорт базы/таблиц в каком-нибудь инструменте, например, phpmyadmin.
    или
    2. Пишете скрипт с двумя коннектами. По первому коннекту делаете порционную выборку, по второму - вставляете результат выборки из первого коннекта.
    Ответ написан
    Комментировать
  • Как исправить ошибку при добавлении строки phpmyadmin?

    @alexalexes
    Ограничения по внешним ключам прямо говорят о том, чтобы по идентификаторам player_id и категории в справочниках players и categories существовали нужные записи, но и сами идентификаторы были того же типа данных, что и первичные ключи справочников.
    Ответ написан
  • Как написать SQL запрос для данного случая?

    @alexalexes
    Сначала обновите записи в таблице checkanaliz:
    update  checkanaliz set id_napravlenie = 1 where id_napravlenie = 2

    Потом удалите из таблицы napravlenie записи:
    delete from napravlenie where id = 2
    Это же элементарные действия, которые вам доступны в SQL.
    Ответ написан
  • Как вывести не id элемента, а слово, которое к нему привязано?

    @alexalexes
    После этой строчки:
    $countryN->execute([':id' => $countries_id]);
    ... вам нужно применить один из методов:
    $rows = $countryN->fetchAll();
    var_dump($rows);

    или
    $row = $countryN->fetch();
    var_dump($row);

    Почитать тут и тут.
    Вкратце, работа с базой идет по таким этапам:
    1) Подключение к БД (хост, логин пароль и тд)
    1.1) Обработка ошибок подключения
    2) Передача параметров кодировки, форматов даты/время, локали и тд
    3) Подготовка запроса (prepare функция)
    3.1) Обработка синтаксических ошибок текста запроса.
    4) Подготовка входных и выходных параметров запроса (bind функция)
    4.1) Обработка ошибок параметров (результат возврата значения bind функции).
    5) Выполнение (execute функция).
    5.1) Обработка ошибок выполнения (обычно, смотрят состояние возврата значения execute функции).
    6) Выборка результата (фетчинг, используем fetch-функции).
    *) https://www.php.net/manual/ru/pdo.errorinfo.php получение состояния ошибки на любом этапе.
    Ответ написан
    Комментировать
  • Как составить SQL запрос?

    @alexalexes
    Зачем вам таблица t1?
    У продукта могут быть несколько родителей?
    Если нет, то t1 избыточна, вам будет достаточно в каждой записи продукта указывать, кто у нее parent.
    Если нужно найти самый дешевый продукт в пределах одного родителя, то делается это так:
    select *
    from (select parent, product,
                        rank() over (partition by parent order by price) price_rnk
               from t2
             )  a
    where price_rnk = 1

    Клауза over partition поддерживается mySQL не ниже 8 версии. Самым распространенным версиям (5 или 6, не помню), нужно делать велосипед из пользовательских переменных @.
    Ответ написан
    1 комментарий
  • Можно ли сохранить последовательность вывода полей?

    @alexalexes
    Все таки сделайте динамически формируемым данные об интервалах, то есть inters можно представить в виде таблицы или генерировать на основе prepod.
    Для "нет данных" можно определить интервал [null, null]:
    select case
             when a.begin is null and a.end is null then 'нет данных'
             when a.begin is not null and a.end is not null then concat(a.end, '-', a.begin)
             when a.begin is null and a.end is not null then concat('ранее ', a.end + 1)
             when a.begin is not null and a.end is null then concat('от ', a.begin)
           end interval_str,
           cnt
    from
    (
    select inters.begin, inters.end, count(prepod.name) cnt
    from
    (
      select null begin, 1969 end union all
      select 1970 begin, 1979 end union all
      select 1980 begin, 1989 end union all
      select 1990 begin, 1999 end union all
      select 2000 begin, null end union all
      select null begin, null end -- запись для тех, у кого нет данных др.
    ) inters -- таблица с интервалами
    left join 
    (
      select 'a' name, STR_TO_DATE('2013-02-11', '%Y-%m-%d') date_r union all
      select 'aa' name, STR_TO_DATE('2010-09-01', '%Y-%m-%d') date_r union all
      select 'b' name, STR_TO_DATE('1968-02-11', '%Y-%m-%d') date_r union all
      select 'bb' name, STR_TO_DATE('1969-01-21', '%Y-%m-%d') date_r union all
      select 'c' name, STR_TO_DATE('1980-02-11', '%Y-%m-%d') date_r union all
      select 'd' name, STR_TO_DATE('1989-02-11', '%Y-%m-%d') date_r union all
      select 'z' name,  null date_r -- препод, у которого нет данных др.
    ) prepod on inters.begin <= year(prepod.date_r) and inters.end >= year(prepod.date_r)
             or inters.begin is null and inters.end >= year(prepod.date_r)
             or inters.begin <= year(prepod.date_r) and inters.end is null
             or prepod.date_r is null and inters.begin is null and inters.end is null
    group by inters.begin, inters.end
    order by inters.begin desc, inters.end desc
    ) a
    Ответ написан
    4 комментария
  • Как разделить число на 100 и прибавить получившейся результат к сумме которую делим?

    @alexalexes
    Если округлять центы в пользу пользователя, то:
    UPDATE dle_users
    SET user_balance = user_balance + round(user_balance / 100.0, 2)

    Если округлять центы в пользу системы, то:
    UPDATE dle_users
    SET user_balance = user_balance + ceil(user_balance / 100.0 * 100) / 100.0
                                                                    ^       ^
                                              корректировка ceil по 2 знакам после запятой
    Ответ написан
    1 комментарий
  • Как проще всего сделать выборку количества каждого типа?

    @alexalexes
    У вас практически готово решение, только отвязать привязку user_id в подзапросах, если вам нужно получить общее кол-во записей по типам из таблицы example.
    SELECT count(e.id) "кол-во записей example со статусом 1",
           (
               select count(type_id)
               from example e_1
               where type_id = 1
                  and e_1.status = 3
           ) "кол-во для типа 1",
           (
               select count(type_id)
               from example e_3
               where type_id = 3
                  and e_3.status = 3
           ) "кол-во для типа 3",
           (
               select count(type_id)
               from example e_4
               where type_id = 4 
                and e_4.status = 3
           ) "кол-во для типа 4"
    FROM example e
    WHERE e.status = 1
         and e.user_id = 53;

    Если получаемая статистика в пределах одного пользователя, то можно использовать такую конструкцию:
    SELECT count(e.id) "кол-во записей example со статусом 1",
                 count(case when e.type_id = 1
                  and e.status = 3 then 1 end)  "кол-во для типа 1",
           count(case when e.type_id = 3
                  and e.status = 3 then 1 end)  "кол-во для типа 3",
         count(case when e.type_id = 4
                  and e.status = 3 then 1 end)  "кол-во для типа 4"
    FROM example e
    WHERE e.status = 1
         and e.user_id = 53;

    Вариант 3.
    SELECT count(case when e.status = 1 then 1 end) "кол-во записей example со статусом 1",
                 count(case when e.type_id = 1
                  and e.status = 3 then 1 end)  "кол-во для типа 1",
           count(case when e.type_id = 3
                  and e.status = 3 then 1 end)  "кол-во для типа 3",
         count(case when e.type_id = 4
                  and e.status = 3 then 1 end)  "кол-во для типа 4"
    FROM example e
    where e.user_id = 53

    Вариант 4.
    -- Считаем статус 1, игнорируем типы
    SELECT 'with_status_1' type_query, null type_id, count(*) cnt
    FROM example e
    where e.status = 1
    and e.user_id = 53
    union all
    -- Считаем остальные типы со статусом 3
    SELECT 'with_another_types' type_query, e.type_id, count(*) cnt
    FROM example e
    where e.status = 3
    and e.user_id = 53
    group by e.type_id
    Ответ написан
    5 комментариев
  • Как применить INNER JOIN к результату запроса?

    @alexalexes
    Было бы с чем соединять...
    SET @var = 4;
    
    Select * from
    (
    -------------Ваш сложный подзапрос --------------------
    SELECT *
    FROM menu
    WHERE FIND_IN_SET(ID,(SELECT GROUP_CONCAT(lv SEPARATOR ',') FROM (
    SELECT @pv:=(SELECT GROUP_CONCAT(ID SEPARATOR ',')
    FROM menu WHERE submenu IN (@pv)) AS lv FROM menu
    JOIN (SELECT @pv:=@var)tmp
    WHERE submenu IN (@pv)) a))
    
    UNION ALL
    SELECT *
    FROM menu
    WHERE ID = @var
    ORDER BY ID
    -------конец сложного подзапроса--------------
    ) complicated_menu
    inner join ваша_таблица vt on complicated_menu.id = vt.id
    Ответ написан
    1 комментарий
  • OpenWRT+PHP7 "Ошибка Call to undefined function mysqli_connect()" не понимаю что делать?

    @alexalexes
    Поиск по OpenWRT ресурсам говорит, что, возможно, проблема в конкретной сборке OpenWRT.
    Попробуйте воспользоваться советом:
    Try this. Check /etc/php7/

    Rename 20_mysqli.ini to 30_mysqli.ini, or delete 20_mysqli.ini if both exist. If you also have 20_openssl.ini there, rename that to 10_openssl.ini.
    Above change is needed to load the modules in the correct order.
    This should now be fixed in the latest builds, but you could be running older code, or suffering from the bug that was there earlier.
    Ответ написан
    1 комментарий
  • Как правильно преобразовать text в дату?

    @alexalexes
    Используйте STR_TO_DATE() вместо DATE_FORMAT, атрибута DOC_TIME это тоже касается.
    PS: Использование этого поля без функции преобразования для операций сравнения не имеет смысла. В этом преступление предыдущего разработчика, выбравшего не тот тип данных.
    Ответ написан
    Комментировать
  • Как сделать выборку в сгруппированном формате?

    @alexalexes
    Я отвечал на подобный вопрос.
    Как произвести правельную выборку статей со всеми тегами?
    В вашем случае посты превращаются в группы, а теги - в занятия групп.
    Ответ написан
    Комментировать
  • Как правильно вывести записи из бд(MySql,PHP)?

    @alexalexes
    Накопите промежуточные строки в $out_arr, соедините элементы массива через разделитель join-ом и подайте на вывод.
    $out_arr = array(); 
    while($hero2 = mysqli_fetch_assoc($hero1))
        {
         
    $time_now = strtotime($hero2['cron1']);
    $time_need = strtotime($hero2['cron2']);
    if($time_need>=$time_now ){
    $t_s= date("H:i ",75600-($time_need-$time_now));
    }
    else
    $t_s= date("H:i ",75600-($time_now-$time_need));
           $out_arr[] = str_replace(":",".",$t_s);
     }
    echo "[".join(' ,',  $out_arr).']';
    Ответ написан
    Комментировать
  • Как реализовать такую выборку SQL?

    @alexalexes
    То есть, если у вас свойство count меньше 3, то выводить для таких позиций count = 0?
    SELECT shop_product.id, if(shop_product_skus.count >= 3, shop_product_skus.count, 0) as count
      FROM shop_product
        join shop_product_skus on shop_product.id = shop_product_skus.product_id 
    WHERE 
        shop_product.id IN (14770, 13287, 14160, 13906)
    Ответ написан
    1 комментарий
  • Какая лучшая практика наименования полей таблицы в MySQL?

    @alexalexes
    Тут дело выбора стандартов внутри группы разработчиков, как договоритесь использовать имена.
    Например, второй способ избыточен при таком подходе написания запросов.
    select country.country_id
    from country

    а вот здесь чуть полегче разобраться к чему относиться псевдоним таблицы:
    select c.country_id
    from country c

    Если умело сокращать имена псевдонимов, то жить можно и при кратком подходе именования:
    select ctry.id
    from country ctry

    Если загвоздка иного рода - именовать поле country_id или id_country.
    Первый вариант правильный с точки зрения англ. языка, а второй - визуально легче отслеживать виды полей, если их записать вертикально.
    Ответ написан
    Комментировать
  • Как оптимально получить симметричные данные в таблице?

    @alexalexes
    Элементарно, заджойнте ту же самую таблицу саму на себя.
    select *
    from t as t1
    join t as t2 on t1.user_id1 = t2.user_id2
                     AND t2.user_id1 = t1.user_id2
    Ответ написан
    2 комментария
  • Как посчитать количество дней с учетом всех выходных в MySQL?

    @alexalexes
    select count(*) as work_day_count --считаем, что осталось после отсечения выходных и праздников
      from (SELECT distinct t1.*, t1.c1 + INTERVAL iterator.day DAY as dt_day
                 FROM (select STR_TO_DATE("01.10.2018", "%d.%m.%Y") c1,  STR_TO_DATE("22.10.2018", "%d.%m.%Y") c2 union all
                       select STR_TO_DATE("22.10.2018", "%d.%m.%Y") c1,  STR_TO_DATE("10.11.2018", "%d.%m.%Y") c2 ) t1 --таблица с проверяемыми интервалами
     
     join (select @start_day := @start_day + 1 as day
             from news,  -- любая произвольная таблица с числом строк, больше чем ширина максимально возможного интервала дней, который можно рассмотреть этим запросом
                  (select @start_day := -1) init_day --инициализация переменной start_day 
          ) iterator --итератор дней, ведет отсчет с 0 и до куда надо (до максимального интервала, который может быть)
       on (t1.c1 + INTERVAL iterator.day DAY) <= t1.c2 --верхнее ограничение итератора
                    and (t1.c1 + INTERVAL iterator.day DAY) not in -- отсекаем выходные и праздники
    (select STR_TO_DATE("06.10.2018", "%d.%m.%Y") c1 union all
     select STR_TO_DATE("07.10.2018", "%d.%m.%Y") c1 union all
     select STR_TO_DATE("13.10.2018", "%d.%m.%Y") c1 union all
     select STR_TO_DATE("14.10.2018", "%d.%m.%Y") c1 union all
     select STR_TO_DATE("20.10.2018", "%d.%m.%Y") c1 union all
     select STR_TO_DATE("21.10.2018", "%d.%m.%Y") c1 union all
     select STR_TO_DATE("27.10.2018", "%d.%m.%Y") c1 union all
     select STR_TO_DATE("28.10.2018", "%d.%m.%Y") c1 union all
     select STR_TO_DATE("03.10.2018", "%d.%m.%Y") c1 union all
     select STR_TO_DATE("04.11.2018", "%d.%m.%Y") c1 union all
     select STR_TO_DATE("10.11.2018", "%d.%m.%Y") c1 union all
     select STR_TO_DATE("11.11.2018", "%d.%m.%Y") c1) -- тут делаем выборку выходных дней и праздников
    order by dt_day ) a
    Ответ написан
    Комментировать
  • Как лучше сделать парсер данных с разных источников?

    @alexalexes
    В вашей схеме еще не хватает подсистемы scheduler - планировщик заданий.
    Его нужно чаще всего запускать по крону (а может он у вас будет вертеться в бесконечном цикле, а может спать в потоковом режиме выполнения).
    Планировщик, на основе результатов проходов паука, парсера, ограничений на проходимых сайтах, нагрузки собственной системы, будет регулировать частоту запуска перезапуска заданий.
    Желательно, чтобы задания паука и парсера были достаточно атомарны.
    Паук в одну страницу постучал, записал статус получения ответа, каков контент в ответе (html или текстовое сообщение, или JSON и тд.), удалось ли ему распознать структуру, метаданные и тд.
    Если, например, вернулась 404 стр, то возможно, с помощью планировщика установить правило, что можно натравить паука на url чуть позже, через час, день, неделю и тд.
    По аналогии, можно фиксировать статусы работы других подсистем checker-а, парсера.
    Если один из модулей застревает на 5 разе на каком-то задании, то сыпать критическую ошибку в лог и тд.

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

    @alexalexes
    Пробуйте этот запрос с вычисленным псевдопараметром dialog_hold.
    Суть в том, что этот параметр одинаковый для переписки пользователя 1 и пользователя 2 в ту и другую сторону.
    Должно получаться число 1000002 при sender_id=1, recipient_id=2 и при sender_id=2, recipient_id=1.
    По этому параметру можно отсортировать переписку так, чтобы беседы пользователей шли по порядку.
    Значение 1000000 должно быть заведомо большое, чем возможно число пользователей в вашей системе в любой исторический период. Однако, max(user_id) * 1000000 + max(user_id) никогда не должно превышать макс. целочисленное значение, с которым может работать СУБД (верхний предел id пользователей, когда этот финт ушами способен работать).
    select a.*
    from (select d.id, d.tovar_id, d.sender_id, d.recipient_id, d.message,
                 case
                   when d.sender_id < d.recipient_id
                   then d.sender_id * 1000000 + d.recipient_id
                   else d.recipient_id * 1000000 + d.sender_id
                 end dialog_hold
            from dialogs d
           where d.tovar_id = :tovar_id
             and (d.sender_id = :user_id or d.recipient_id = :user_id)
          ) a
    order by  a.tovar_id, a.dialog_hold, a.id
    Ответ написан
  • Как удалить нужную запись из БД?

    @alexalexes
    Если заняться изучением основ SQL, то можно понять, что в данной ситуации самым оптимальным решением будет - выполнить запрос с параметром:
    DELETE FROM videos WHERE id = ?
    Естественно, на странице браузера надо обеспечить, чтобы при нажатии кнопки "Удалить" серверу передавался id удаляемой записи, помимо того, какое действие мы хотим совершить.
    Серверный скрипт, также должен принимать не только параметр вида действия (delete), но параметр id, на какую запись необходимо направить действие. Далее, структура SQL-запроса должна иметь в себе возможность подставить параметр.
    PS:
    $ids = R::getAssoc('SELECT id FROM videos');
        $videos = R::find( 'videos', 'id = ?', $ids );

    Самое не оптимальное решение - выгребать все записи из таблицы, а потом на стороне серверного приложения искать ту единственную, которая удовлетворяет условию. Эта медвежья услуга нагружает тракт обмена данных между веб-сервером и СУБД-сервером.
    Ответ написан
    Комментировать