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

    erge
    @erge
    Примус починяю
    как-то так:

    см. на sqlfiddle
    select e.id, e.name
      from employee e
      join (
        select employee_id
          from empl_services es
          join services s on s.id = es.service_id
          where s.title in ('Крутит гайки','Носит ящики')
          group by employee_id
          having count(1) = 2
      ) t on t.employee_id = e.id
    ;
    
    -- если id услуг известны то так:
    
    select e.id, e.name
      from employee e
      join (
        select employee_id
          from empl_services es
          where service_id in (1,3)
          group by employee_id
          having count(1) = 2
      ) t on t.employee_id = e.id
    ;


    PS: тут обязательно надо в выражении having count(1) = ?? подставлять количество услуг перечисляемых в IN(...)
    на 8ке можно по другому через WITH, а в having count(1) подставлять count по подзапросу услуг...

    UPD:
    на 8ке так:

    with 
    s as (
      select id from services where title in ('Крутит гайки','Носит ящики')
    ),
    r as (
      select employee_id from empl_services es
        join s on s.id = es.service_id
        group by employee_id
        having count(employee_id) = (select count(1) from s)
    )
    select *
      from employee e
      join r on r.employee_id = e.id
    ;


    см. на dbfiddle
    Ответ написан
  • Почему php выводит из базы что то одно?

    erge
    @erge
    Примус починяю
    Подозреваю что на выходе , после цикла
    while($row = mysqli_fetch_array($res))
    Result set - $res становится ПУСТЫМ! поэтому второй while его не отрабывает.
    и либо
    - его необходимо наполнить заново, повторно выполнив запрос
    $res = mysqli_query($dbc, $query);

    либо, что более корректно:

    1) заполнить из result set некий массив, далее по коду уже работать с массивом.

    2) на каждом номере класса выполнять запрос
    SELECT * FROM `pupils` WHERE class = 'НОМЕРКЛАССА' -- я допустил что колонка у вас называется class

    и далее делать вывод анологично.

    3) что еще более правильное:
    получить из базы список классов, например
    SELECT DISTINCT class FROM `pupils` -- я допустил что колонка у вас называется class


    далее цикл по резалтсету
    выводим
    <div class="cl">
          <h3>НОМЕРКЛАССА</h3>


    делаем запрос вида
    SELECT * FROM `pupils` WHERE class = 'НОМЕРКЛАССА' -- я допустил что колонка у вас называется class


    далее цикл по резалтсету
    выводим
    <h4>ФИО</h4>
    конец вложенного цикла

    выводим закрывающий тэг </div>

    конец первого цикла.

    как-то так... ну код сами напишете ;)
    Ответ написан
    4 комментария
  • Как сделать дамп большой базы в Mysql на Windows?

    erge
    @erge
    Примус починяю
    Не 7zFM.exe а 7z.exe

    Первый это оконный файловый менеджер, второй работает из командной строки

    см. опции и ключи запуска:

    7-Zip 19.00 (x86) : Copyright (c) 1999-2018 Igor Pavlov : 2019-02-21

    Usage: 7z [...] [...] [@listfile]


    a : Add files to archive
    b : Benchmark
    d : Delete files from archive
    e : Extract files from archive (without using directory names)
    h : Calculate hash values for files
    i : Show information about supported formats
    l : List contents of archive
    rn : Rename files in archive
    t : Test integrity of archive
    u : Update files to archive
    x : eXtract files with full paths


    -- : Stop switches and @listfile parsing
    -ai[r[-|0]]{@listfile|!wildcard} : Include archives
    -ax[r[-|0]]{@listfile|!wildcard} : eXclude archives
    -ao{a|s|t|u} : set Overwrite mode
    -an : disable archive_name field
    -bb[0-3] : set output log level
    -bd : disable progress indicator
    -bs{o|e|p}{0|1|2} : set output stream for output/error/progress line
    -bt : show execution time statistics
    -i[r[-|0]]{@listfile|!wildcard} : Include filenames
    -m{Parameters} : set compression Method
    -mmt[N] : set number of CPU threads
    -mx[N] : set compression level: -mx1 (fastest) ... -mx9 (ultra)
    -o{Directory} : set Output directory
    -p{Password} : set Password
    -r[-|0] : Recurse subdirectories
    -sa{a|e|s} : set Archive name mode
    -scc{UTF-8|WIN|DOS} : set charset for for console input/output
    -scs{UTF-8|UTF-16LE|UTF-16BE|WIN|DOS|{id}} : set charset for list files
    -scrc[CRC32|CRC64|SHA1|SHA256|*] : set hash function for x, e, h commands
    -sdel : delete files after compression
    -seml[.] : send archive by email
    -sfx[{name}] : Create SFX archive
    -si[{name}] : read data from stdin
    -slp : set Large Pages mode
    -slt : show technical information for l (List) command
    -snh : store hard links as links
    -snl : store symbolic links as links
    -sni : store NT security information
    -sns[-] : store NTFS alternate streams
    -so : write data to stdout
    -spd : disable wildcard matching for file names
    -spe : eliminate duplication of root folder for extract command
    -spf : use fully qualified file paths
    -ssc[-] : set sensitive case mode
    -sse : stop archive creating, if it can't open some input file
    -ssw : compress shared files
    -stl : set archive timestamp from the most recently modified file
    -stm{HexMask} : set CPU thread affinity mask (hexadecimal number)
    -stx{Type} : exclude archive type
    -t{Type} : Set type of archive
    -u[-][p#][q#][r#][x#][y#][z#][!newArchiveName] : Update options
    -v{Size}[b|k|m|g] : Create volumes
    -w[{path}] : assign Work directory. Empty path means a temporary directory
    -x[r[-|0]]{@listfile|!wildcard} : eXclude filenames
    -y : assume Yes on all queries


    так же смотрите - mysql, Утилита командной строки

    но подозреваю, что все равно не получится, надо указывать какой конкретно файл распаковывать и кидать в stdout, потому что распаковаться могут не в том порядке как надо.

    как-то так наверно:
    "C:\Program Files (x86)\7-Zip\7z.exe" x -so G:\FIAS\fias_07.10.19.zip sql_file1.sql | G:\MySqlWork\mysql.exe -uroot -p 4830 newBase
    "C:\Program Files (x86)\7-Zip\7z.exe" x -so G:\FIAS\fias_07.10.19.zip sql_file2.sql | G:\MySqlWork\mysql.exe -uroot -p 4830 newBase


    и так перебрать все по порядку.
    Ответ написан
  • Можно ли в запросе mysql сделать Group_concat в group concat?

    erge
    @erge
    Примус починяю
    Строчку 'valueDstidArr',r(CONCAT(`value_src`.id),`value_dst`.value) - concat заменить на group_concat не получается пишет что синтаксическая ошибка.


    и правильно пишет.
    почитайте внимательнее про group_concat
    что вы и как собрались конкатенировать??

    по данной строчке - r(CONCAT(`value_src`.id),`value_dst`.value)
    1 - что есть r?
    2- CONCAT(`value_src`.id) c чем кокатенируете??

    поэтому здесь не очень понятно что вы хотите загнать в GROUP_CONCAT

    И если вы хотите сделать допустим GROUP_CONCAT (`value_src`.id) непонятно зачем у вас GROUP_CONCAT охватывает гораздо шире...???

    GROUP_CONCAT(DISTINCT  JSON_OBJECT(
        'value', `value_dst`.value,
        'param_dst_id', `value_dst`.param_dst_id,
        'type',param_type_id(`value_dst`.param_dst_id),
        'ref_id',ref_id(`value_dst`.param_dst_id),
        'title',param_title(`value_dst`.param_dst_id),
        'valueDstidArr',r(CONCAT(`value_src`.id),`value_dst`.value)
          )) AS `realValuesArr2`


    Нужно делать GROUP_CONCAT того чего нужно... а не всего подряд и внутрь пытаться запихать еще один GROUP_CONCAT. GROUP_CONCAT объединяет несколько записей в одну, что он будет делать внутри другого GROUP_CONCAT, когда записи уже объединены?

    Так же, Имхо... все поля что находятся вне GROUP_CONCAT должны быть в GROUP BY !

    я думаю, что вместо вашего GROUP_CONCAT .. AS `realValuesArr2` должно быть как-то так:

    ...
    JSON_OBJECT(
        'value', `value_dst`.value,
        'param_dst_id', `value_dst`.param_dst_id,
        'type',param_type_id(`value_dst`.param_dst_id),
        'ref_id',ref_id(`value_dst`.param_dst_id),
        'title',param_title(`value_dst`.param_dst_id),
        'valueDstidArr', GROUP_CONCAT( r(`value_src`.id,`value_dst`.value) )
          ) AS `realValuesArr2`
    ...


    не знаю что За функция r() И CONCAT одного поля не нужен.

    а поля
    `value_dst`.value,
    `value_dst`.param_dst_id,
    должны быть в GROUP BY
    Ответ написан
    Комментировать
  • Как считать данные из таблицы MySQL и внести их в массив с последующей записью?

    erge
    @erge
    Примус починяю
    Можно результат запроса обернуть в JSON форму, а в php к результату применить json_decode($result, true)

    SQL запрос:
    SELECT
        CONCAT(
          '{"',`session`,'":{',
          GROUP_CONCAT('"PRODUCT ', @i:=@i+1, '":{"PRODUCT ID":',product_id,',"PRICE":',price,',"QUANTITY":',quantity,'}' separator ','),
          '}}') AS value
      FROM carts, (SELECT @i:=0) X
      WHERE `session` = 222145
      GROUP BY `session`


    пример работы на sqlfiddle

    в PHP как-то так:
    $session_id = 222145;
    
    $sql = 'SELECT
        CONCAT(
          \'{"\',`session`,\'":{\',
          GROUP_CONCAT(\'"PRODUCT \', @i:=@i+1, \'":{"PRODUCT ID":\',product_id,\',"PRICE":\',price,\',"QUANTITY":\',quantity,\'}\' separator \',\'),
          \'}}\') AS value
      FROM carts, (SELECT @i:=0) X
      WHERE `session` = %s
      GROUP BY `session`';
    
    $arr = json_decode(mysql_result(mysql_query(sprintf($sql, $session_id)),0), true);
    
    var_dump( $arr );
    Ответ написан
    Комментировать
  • Как обработать и сравнить большой массив данных?

    erge
    @erge
    Примус починяю
    вариантов есть несколько....
    1) загружаете данные доступными вам способами во временную таблицу, далее UPDATE по этой таблице
    если из PHP, то собрать из массива запрос вида
    INSERT INTO tmp_goods (name, article, price)
      VALUES ('NAME_1', 'ARTICLE_1', PRICE 1),
    .......
             ('NAME_N', 'ARTICLE_N', PRICE_N)
    ;


    после чего выполнить UPDATE:
    UPDATE goods g
      INNER JOIN tmp_goods t ON t.article = g.article
      SET g.price = t.price
      WHERE g.price != t.price
    ;


    и очистить tmp_goods если она более не нужна.

    2) собрать из массива запрос вида:
    UPDATE goods
    SET price = CASE article
    WHEN ARTICLE_1 THEN PRICE_1
    WHEN ARTICLE_2 THEN PRICE_2
    ....
    ELSE price END


    так же есть операторы:
    REPLACE ,
    INSERT ON DUPLICATE KEY UPDATE
    и вообще погуглите - MySQL множественный апдейт

    и... еще вариант:
    можно обойтись без временной таблицы (как в варианте 1)...
    соберите из массива запрос вида:

    UPDATE goods g
      INNER JOIN (
        SELECT 'ARTICLE-1' AS article, PRICE_1 AS price UNION
        SELECT 'ARTICLE-2', PRICE_2 UNION
        SELECT 'ARTICLE-3', PRICE_3 UNION
    ...
        SELECT 'ARTICLE-N', PRICE_N
        ) t ON t.article = g.article
      SET g.price = t.price
      WHERE g.price != t.price
    ;


    смотрите пример на sqlfiddle (сосбтвенно update в левом поле описания схемы)
    Ответ написан
    Комментировать
  • Вывод до первого совпадения SQL?

    erge
    @erge
    Примус починяю
    вроде как-то так, если правильно понимаю

    SELECT m.*, u.* FROM messages m
      INNER JOIN users u ON m.receiver = u.id
      INNER JOIN (
        SELECT receiver, sender, max(date) as date
          FROM messages
          GROUP BY receiver, sender
      ) m2 ON m.receiver = m2.receiver
          AND m.sender = m2.sender
          AND m.date = m2.date
      WHERE u.id = 1
      ORDER BY m.date DESC


    но не понятно зачем джойнится users на ресейвера, может все-таки на сендера? ведь в диалоге должны отображаться имена отправителей??

    SELECT m.*, u.* FROM messages m
      INNER JOIN users u ON m.sender = u.id
      INNER JOIN (
        SELECT receiver, sender, max(date) as date
          FROM messages
          GROUP BY receiver, sender
      ) m2 ON m.receiver = m2.receiver
          AND m.sender = m2.sender
          AND m.date = m2.date
      WHERE m.receiver = 1
      ORDER BY m.date DESC
    Ответ написан
  • Как достать значения из нескольких таблиц MySQL, чтобы в результате можно было определить из какой таблицы какие значения извлеклись?

    erge
    @erge
    Примус починяю
    SELECT 'table1' as tabl, id
      FROM table1
      WHERE name= 'Tom'
    UNION 
    SELECT 'table2' as tabl, id
      FROM table2
      WHERE name= 'Tom'
    UNION 
    SELECT 'table3' as tabl, id
      FROM table3
      WHERE name= 'Tom'
    Ответ написан
    Комментировать
  • Как получить количество товаров для категории которая имеет подкатегории?

    erge
    @erge
    Примус починяю
    как-то так - тык

    select c.title, count(p.product_id )
      from (
    select title, category_id from categories c where c.category_id IN (1,2)
    UNION
    select
        (select title from categories c1 where c1.category_id = c.parent_id) as title,
        category_id
      from categories c where parent_id IN (1,2)
        ) c
       JOIN products p ON p.category_id = c.category_id
      GROUP BY c.title


    если уровень вложенности больше чем 1, то смотри в гугле обход дерева на MySQL
    mysql обход дерева
    Обход дерева
    Задача отображения деревьев в MySql. Способ отобра...
    Иерархические (рекурсивные) запросы
    и т.д.
    Ответ написан
    Комментировать
  • Как создать таблицу где записи соответствуют записям из старой таблицы?

    erge
    @erge
    Примус починяю
    создать дуликат таблицы:
    CREATE TABLE users2 [AS] SELECT * FROM users;

    вставить строки:
    INSERT IGNORE
        INTO users2 (id_user, name, ................)
    SELECT
        id_user, name, ..................
    FROM
        users
    Ответ написан
    Комментировать
  • Как сформировать запрос к MySQL?

    erge
    @erge
    Примус починяю
    select r.resources_id, r.resources_name, count(s.statistics_url)
      from resources r
      left join statistics s on s.statistics_url = concat ('/resource/', r.resources_id)
      group by r.resources_id, r.resources_name
    Ответ написан
    Комментировать
  • Как поменять формат даты при экспорте в Excel?

    erge
    @erge
    Примус починяю
    Один из вариантов - в запросе приводить дату к необходимому формату:
    см. Функции форматирования даты и времени
    MySQL функция CASE
    MySQL Пример конкатенации (сложении) строк-значени...

    SELECT
      Proect,
      CodZadachi,
      Tema,
      Status,
      Ispolnitel,
      Avtor,
      CONCAT(
        CASE DATE_FORMAT(DataSozdania,'%m')
          WHEN '01' THEN 'Январь'
          WHEN '02' THEN 'Февраль'
          WHEN '03' THEN 'Март'
          WHEN '04' THEN 'Апрель'
          WHEN '05' THEN 'Май'
          WHEN '06' THEN 'Июнь'
          WHEN '07' THEN 'Июль'
          WHEN '08' THEN 'Август'
          WHEN '09' THEN 'Сентябрь'
          WHEN '10' THEN 'Октябрь'
          WHEN '11' THEN 'Ноябрь'
          WHEN '12' THEN 'Декабрь'
        END,
        DATE_FORMAT(DataSozdania,' %e %H:%i %Y')
      ) AS DataSozdania,
      Opisanie,
      DataSoveschania,
      SrokIspolnenia,
    FROM БД WHERE OTKRITA = 1 AND Proect = 'ТАБЛИЦА'


    Можно через регулярные выражения в PHP заменить все английские названия месяцев на русские см. Функции для работы с регулярными выражениями (Perl...

    Но в таком виде для Excel это будет обычная строка, дата не распознается.

    можно отформатировать дату в запросе (см. выше) в формат dd.mm.yyyy hh:mi, такой формат Excel понимает.
    и потом применить к ячейке необходимое форматирование даты, формат будет такой: MMMM DD HH:MM YYYY
    но название месяца склоняется (по крайней мере в LibreOffice) и выглядит как-то не очень.
    см. например: PHPEXCEL: КАК УСТАНОВИТЬ ФОРМАТ ДАТЫ ДЛЯ ЯЧЕЙКИ
    Ответ написан
    Комментировать
  • Как делать обновление таблицы раз в секунду?

    erge
    @erge
    Примус починяю
    а почему бы не сделать это все одним апдейтом?
    разве в MySQL не работают подзапросы?

    UPDATE score sc
      SET score = score + (
                          SELECT card * 3.75 + cardrack * 7.5 + videocardroom * 15
                          FROM auto1 a
                          WHERE a.vk_id = sc.vk_id
                          )
    ;


    PS: кроме того этот апдейт вообще можно из bash скрипта по крону запускать.
    Ответ написан
    Комментировать
  • Как правильно вывести данные из двух таблиц с помощью JOIN MySQL?

    erge
    @erge
    Примус починяю
    SELECT ord.order_id, prj1.project_title as project_title_from , prj2.project_title as project_title_to FROM `orders` ord
    JOIN `projects` prj1 ON prj1.project_id=ord.order_from
    JOIN `projects` ptj2 ON prj2.project_id=ord.order_to
    Ответ написан
    Комментировать
  • Каким образом конвертировать в PgSQL тип MySQL binary с его значениями?

    erge
    @erge
    Примус починяю
    Смотрите Типы данных в PostgreSQL
    в PostgreSQL это тип данных bytea - Binary Data Types
    Ответ написан
    Комментировать
  • ORDER BY IF - сортировка по двум полям?

    erge
    @erge
    Примус починяю
    мне кажется что группировка только ради count ? тогда не должно быть price, а sum(price)
    а вообще проверку картинки надо делать другим образом.
    вы же делаете LEFT JOIN , соответственно из картинок присоединяются те что есть, а к тем записям с прайсами где нет картинок будут NULL записи картинок.
    соответственно проверять надо :
    IF((`mf`.`ID` IS NOT NULL AND `a`.`Price` > 0), 1, 0) DESC

    без группировок
    соответственно если есть запись в картинках (ID != null) и прайс > 0, то IF вернет 1 , в иных случаях 0
    и по этим 1 и 0 произведется обратная сортировка.
    т.е. сверху как раз должны быть записи с ценой и картинками.
    Ответ написан
    Комментировать
  • MySQL Как сделать Update и Insert на таблицы с LEFT JOIN?

    erge
    @erge
    Примус починяю
    т.к. БД нормализованна и данные хранятся в разных таблицах, то и обновлять и/или вставлять надо несколькими запросами в соответствующие таблицы в одной транзакции.
    в shedules у вас только : время, дата, номер рейса, цена эконом класса, подтвержден
    остальное в связанных таблицах, которые обновляются отдельными запросами.
    Ответ написан
    Комментировать