Ответы пользователя по тегу MySQL
  • Как запросом перемешать числа?

    LaRN
    @LaRN
    Senior Developer
    Если это разовая акция, то просто UPDATE решает задачу, но если это будет требоваться делать периодитчески, то можно создать отдельную таблицу c полями position и newposition и сохранить в нее для каждого значения position из исходной таблицы новое значение newposition.
    А далее в запросах джойнить две таблицы.
    Если в созданной таблице сделать первичный ключ по position, то джойн будет очень быстрым.

    Плюсы такого решения:
    Таблица product не блокируется (UPDATE накладывает блокировки, кроме этого каждый апдейтв - это запись в журнале транзакций, что тоже не бесплатно)

    Не происходит перестроения индексов в которые входит поле position (если таблица product большая - это существенно может сказаться на производительности)

    Не происходит деградации статистики по полю position, если по этому полю плохая статистика оптимизатор не сможет построить хороший запрос.

    Если в других таблицах есть ссылка на поле position, эти таблицы не придется также апдейтить.

    В случае сбоя скрипта наполняющего новую таблицу вы ничего не теряете (очистили полностью и наполнили заново), в случае апдейта исходной таблицы могут быть варианты.

    Из минусов:
    Нужно поддерживать еще одну таблицу.
    Нужно переписать запросы - добавить джой.
    Ответ написан
    Комментировать
  • Почему данные из формы не добавляются в бд?

    LaRN
    @LaRN
    Senior Developer
    Похоже что в запросе лишняя запятая и происходит sql ошибка.
    Вот тут:
    '".$password."',
    )", $link);

    Перед закрывающей скобкой в секции values запятая не нужна.
    Попробуйте так:
    '".$password."'
    )", $link);
    Ответ написан
    Комментировать
  • Возможно объединить 2 запроса в 1?

    LaRN
    @LaRN
    Senior Developer
    В MS SQL такой вариант нормально срабатывает:

    SELECT product_status.*,
                 product.*,
                 pay.*,
                 ((SELECT SUM(pay.summa)
                     FROM pay
                   WHERE pay.pay_id = product.paysystem_id)/product.price)*100 AS 'percent'
        FROM product_status 
          JOIN product 
            ON product.status_id = product_status.id 
          JOIN pay 
            ON pay.pay_id = product.paysystem_id
    Ответ написан
    Комментировать
  • JOIN MySQL с 2 таблицами?

    LaRN
    @LaRN
    Senior Developer
    Тут у третьей таблицы нужно задать уникальный алиас, тогда сработает.
    Например так:

    SELECT to_t.name,  to_t.id, to_t2.name,  to_t2.id
       FROM to_team_games to_t_g 
         LEFT JOIN to_teams to_t   on to_t_g.team_id_1 = to_t.id 
         LEFT JOIN to_teams to_t2 on to_t_g.team_id_2 = to_t2.id 
    WHERE to_t_g.id= 1
    Ответ написан
    Комментировать
  • Как создать учетные записи MySQL из программы Python?

    LaRN
    @LaRN
    Senior Developer
    Можно создать аккаунт для приложения в целом и через этот аккаунт ходить в БД.
    Пользователи работают с приложением (и при этом не имеют напрямую доспупа к БД), контроль прав происходит на уровне приложения, там же происходит добавление новых пользовательских аккаутнов, но это уже не аккаунты БД, а аккаунты приложения.
    Ответ написан
    Комментировать
  • Как избежать одновременного UPDATE таблицы базы данных MySQL?

    LaRN
    @LaRN
    Senior Developer
    Транзакции всем хороши, но под нагрузкой приводят к замедлению работы приложения и иногда, если не правильно работать с запросами к deadlock-м.

    Можно создать отдельную таблицу в которую записывать запросы пользователей на получение ресурса, например так:
    идентификатор пользователя, идентификатор ресурса, статус заявки (в очереди, обработана, отклонена), дата и время заявки с точностью до миллисекунд (ну или числовое поле с автонумерацией).

    При нажатии на "купить товар" операция выполняется в два шага, первый шаг - помещаем заявку пользователя в эту таблицу. (несколько пользователей могут придти за одним ресурсом и приоритет будет у того кто пришел первым)
    Таблица нужна, чтобы не накладывать блокировок на таблицы БД (блокировки могут быть из-за открытой транзакции)

    Далее второй шаг - запускаем процедуру получения статуса заявки (она должна вернуть ответ получил пользователь свой ресурс или нет, т.е. обработана его заявка успешно или отклонена).

    Обработка заявок - это отдельный серверный процесс, он берет заявки по очереди поступления и обрабатывает (изменяет состояние ресурса в БД и состояние заявки) до тех пор пока у выбранного ресурса хватает количества, все пользователи которым не хватило ресурса получают сообщение о невозможности получить ресурс.
    Ответ написан
    3 комментария
  • Как упростить запрос с группировкой, максимальным значением и JOIN в MySQL?

    LaRN
    @LaRN
    Senior Developer
    В подзапросе таблица s_products_discount не нужна, можно вот так попробовать:

    SELECT pd.product_id,
           d.name,
           d.discount_percent,
           d.discount_amount
      FROM s_products_discount pd
      LEFT JOIN s_discounts     d
             ON d.id = pd.discount_id 
      LEFT JOIN (SELECT MAX(d.priority) as max_priority
                   FROM s_discounts dd
                  WHERE dd.id         = pd.discount_id
                    AND dd.visible    = 1
                    AND dd.date_from <= '2018-05-05'
                    AND dd.date_to   >= '2018-05-05') pp 
             ON pp.max_priority = d.priority
     WHERE pd.product_id IN ('41987', '41988', '41989', '41990', '41991', '41992', '41993', '41994')
    Ответ написан
  • Как правильно взаимодействовать с БД при многопоточности?

    LaRN
    @LaRN
    Senior Developer
    Про суть ошибки написано тут https://habrahabr.ru/post/21326/ или тут www.mysql.ru/docs/man/Commands_out_of_sync.html

    Не ясно как реализован ваш класс доступа к БД. Но если все воркеры идут через один общий коннект, то тогда по ссылкам указано что происходит. По хорошему каждый воркер должен открывать свой коннект к БД.
    Ответ написан
    2 комментария
  • Каким должен быть запрос?

    LaRN
    @LaRN
    Senior Developer
    У вас зажимка на список виртуальных чатов и она отсекает общие.
    Можно это условие:
    WHERE c.virtual_id IN ('ind_4_9', 'ind_4_20', 'ind_4_32')
    Изменить как-то так:
    WHERE (c.virtual_id IN ('ind_4_9', 'ind_4_20', 'ind_4_32') or c.type in (all, all_teachers, all_students))
    Ответ написан
  • Почему запрос к бд возвращает ошибку?

    LaRN
    @LaRN
    Senior Developer
    Зачем в этом запросе используется поле id, оно же всегда null, может так переписать:

    $sql = mysql_query("INSERT INTO User ('name', 'surname') VALUES ('".$name."', '".$surname."')");
    Ответ написан
    Комментировать
  • Как организовать быстрый поиск?

    LaRN
    @LaRN
    Senior Developer
    Можно провести нормализацию и вынести например поле artist в отдельный справочник, а в текущей таблице заменить его идентификатором artist-a. Тогда поис по артистам будет быстрым из небольшого их количества по сравнению с композициями, join таблиц по идентификатору намного быстрее like. По полю title нужна искать через like тут ничего не поделаешь.
    Ответ написан
    5 комментариев
  • Как вставить строку, только если такой нет?

    LaRN
    @LaRN
    Senior Developer
    В запросе вставки можно использовать конструкцию not exists
    https://dev.mysql.com/doc/refman/5.7/en/exists-and...
    Ответ написан
    Комментировать
  • Как правильно составить SQL запрос?

    LaRN
    @LaRN
    Senior Developer
    Можно так попробовать:
    SELECT OrderId, MAX(Amount) AS Amn
    FROM Orders
    GROUP BY OrderId
    ORDER BY Ann DESC
    LIMIT 1
    Ответ написан
    Комментировать
  • Как оптимизировать запрос с ORDER BY и FULLTEXT search?

    LaRN
    @LaRN
    Senior Developer
    Можно попробовать без подзапроса, так не будет вложенного цикла по большой таблице:
    SELECT t1.*, MATCH (t1.shingle) AGAINST ('слово' IN BOOLEAN MODE) AS ind
    FROM shingles as t1
    ORDER BY t1.ind DESC, t1.count DESC
    LIMIT 5
    Ответ написан
  • Как запросом MySQL получить максимальный промежуток по времени между записями в таблице?

    LaRN
    @LaRN
    Senior Developer
    Если нигде не накосячил, то как-то так. Правда не уверен в эффективности такого запросы если таблицы будут очень большими. Смысл такой: для каждого id находим минимальное по времени расстояние до следующего id и находим максимальное из этих расстояний.
    SELECT
    t1.id AS 'ID',
    CONCAT(t1.id,'-',t2.id) AS 'id разница',
    MIN(ABS(TIMESTAMPDIFF(MINUTE,t1.datetime,t2.datetime))) AS 'разница минут'
    FROM TABLE_NAME AS t1
    JOIN TABLE_NAME AS t2 on t2.datetime > t1.datetime
    GROUP BY t1.ID, t2.ID
    ORDER BY 3 DESC
    LIMIT 1
    Ответ написан
    Комментировать
  • В одном запросе сгруппировать строки с условием?

    LaRN
    @LaRN
    Senior Developer
    Если вариантов кодов всего два "en" и "не en", то можно попробовать так:

    select ifnull(a_not_en.id, a_en.id), ifnull(a_not_en.name, a_en.name), ifnull(a_not_en.lang_code, a_en.lang_code), ifnull(a_not_en.translate_id, a_en.translate_id)
    from Articles a_en
    left join Articles a_not_en
    on a_not_en.id = a_en.id
    where a_en.lang_code = 'en'
    Ответ написан
    1 комментарий
  • Как правильно составить запрос к БД?

    LaRN
    @LaRN
    Senior Developer
    Если я правильно понял задание, то как-то так
    SELECT *
    FROM images_category
    Left Join images_to_category
    ON images_category.id = images_to_category.id_category
    AND images_to_category.id_file = 15
    WHERE images_to_category.id_category is null
    Ответ написан
    Комментировать