Задать вопрос
  • Как уменьшить время выполнения запроса?

    @alexalexes
    Делаете отдельную таблицу, в единственном поле и записи которой храните значение этого кол-ва.
    Создаете триггеры для таблицы posts на операции вставки, обновления, удаления.
    В триггере используете этот запрос на подсчет кол-ва и вставку/обновление этого значения в таблице количеств.
    Этим триггером вы переложите 30мс из операции select подсчета кол-ва, на операции insert, update, delete, во время вставки нового значения (обновления категории, статуса, удаления записи), причем в триггере можно игнорировать пересчет, если запись вставляется не того вида (не категория 4 и не статус 1).
    Количество особых записей всегда можно получить моментально из той самой таблицы.
    Ответ написан
  • Как защитить сайт от скачивание файлов?

    @alexalexes
    Запускать игру только в своем окружении.
    Для пользователя написать тонкий клиент в виде видеоплеера с возможностью передавать команды управления интерфейсу приложения.
    На поставщика игры ложится вся ноша генерировать контент в реальном времени - удовольствие не из дешевых.
    На пользователя - иметь широкий интернет канал с малым пингом.
    Цель сохранения авторских прав будет достигнута, но ресурсы будут потрачены о-го-го.
    Ответ написан
    Комментировать
  • Как сделать заголовок "УСЛУГИ" ближе к центру?

    @alexalexes
    Поиграйтесь со стилями селектора, в частности с внутренними отступами:
    .jumbotron {
        padding: 4rem 2rem;
    }

    PS: Не забывайте про медиазапросы с тем же селектором.
    Ответ написан
    Комментировать
  • Как вырезать нужную часть предложения с помощью MySQL?

    @alexalexes
    Можно с помощью функции SUBSTRING_INDEX.
    Два раза применяете эту функцию:
    1. Получаете часть строки "Eau Claire - Home 83", указав разделитель " of ", а номер -1.
    2. Получаете часть строки "Eau Claire", указав разделитель " - ", а номер 1.
    Ответ написан
    2 комментария
  • DELETE FROM list WHERE id = 'id строки в списке дел'. Как мне указать этот id?

    @alexalexes
    1. Подготовить текст запроса prepare-функцией.
    2. Присобачить нужные параметры запроса bind-функцией.
    3. Выполнить запрос execute-функцией.
    Запрос не выполняется? Посмотреть ошибки.
    PS: В любой непонятной ситуации читай документацию.
    Ответ написан
    Комментировать
  • Как реализовать прокрутку текста с помощью табов?

    @alexalexes
    1. Определяете список заголовков.
    2. Определяете offsetTop у каждого заголовка.
    3. Определяете scrollTop у прокручиваемого блока.
    5. Определяете по offsetTop-ам i-ый и i+1 заголовок, где находится значение scrollTop.
    6. Для стрелки вверх делаете scrollTo до i-ого заголовка.
    7. Для стрелки вниз делаете scrollTo до i+1 заголовка.
    8. Если i-ого или i+1 заголовка нет, то гасите кнопку.
    9. На событии скроллинга нужно анализировать пункты 1-8, чтобы кнопки вовремя гасились.
    Ответ написан
    Комментировать
  • Как отзеркалить сопутствующие товары?

    @alexalexes
    Вы этой таблицей кодируете граф (не важно чего).
    Если принимаете за правило, что каждая запись кодирует ребро графа только в одном направлении (граф является направленным), то, чтобы добавить другое направление, тогда вам нужно вставить еще одну запись.
    Например, существует ребро от вершины 1885 до вершины 4683, чтобы прописать ребро с обратным направлением, нужно вставить запись (4683, 1885).
    Список ребер к присоединенным вершинам от данной вершины достаточно выбирать таким запросом:
    select * from t
    where t.idProduct = :id_product and t.relatedProduct <> :id_product -- сравнение с <> исключает петлю на собственной вершине

    Если у вас граф ненаправленный, то можно обойтись одной записью. При получении выборки (ребер графа) вам нужно выбирать не только ребра от вершины idProduct до relatedProduct, но включать те записи, ребра которые прописаны от relatedProduct до idProduct.
    Скорее всего запрос будет иметь такой вид:
    select * from t
    where (    (t.idProduct = :id_product and t.relatedProduct <> :id_product) -- сравнение с <> исключает петлю на собственной вершине
                or (t.relatedProduct = :id_product and t.idProduct <> :id_product))

    Но обязательно нужно определиться, работает ли совместимость товаров в обе стороны, от этого зависит выбор типа графа и правила его чтения/записи.
    Ответ написан
    6 комментариев
  • Можно ли задавать кривые Безье для функций js?

    @alexalexes
    https://easings.net/ru#
    Открываете любой график.
    Внизу приведена формула математической функции.
    Ее используете для создания своего JS аналога.
    Ответ написан
    Комментировать
  • Перенос кириллицы со слешом?

    @alexalexes
    Есть старый добрый тег nobr, который объединяет подстроку, переносимую полностью.
    №<br/><nobr>п/п</nobr>
    Ответ написан
    Комментировать
  • Как во vue js подсунуть добавить переменную в атрибут ссылки href?

    @alexalexes
    Атрибуты тегов конструировать нужно при помощи v-bind (v-bind:href или :href).
    Если внутри кавычек используется объект, то он воспринимается как селектор атрибутов, если строка - то склеивается строка в итоговом значении атрибута.
    <span> Вы получили предложение от пользователя <a v-bind:href="'users/' + item.slug">{{ item.name }}</a></span>
    Ответ написан
    1 комментарий
  • Как объединить GROUP BY и JOIN?

    @alexalexes
    Чтобы найти читателей с последними взятыми книгами, нужно при помощи оконной функции row_number пронумеровать строки в пределах каждого читателя (задав партицию по айди читателя) в порядке убывания по дате taken_at. Из полученного результата взять строки, которые получили номера 1.
    select * from
    (select r.id as reader_id, r.first_name, r.last_name, b.id book_id, b.name, b.pub_date, row_number() over (partition by r.id order by l.taken_at desc) as rownum
    from readers r
    left join log_taking l on r.id = l.reader_id
    left join books b on b.id = l.book_id
    ) a
    where a.rownum = 1

    PS: Связка left join выведет всех читателей, в независимости, брали они книги или нет. Просто join даст список читателей, которые брали книги хоть один раз.
    PPS: Оконные функции доступны с MySQL версии 8.
    Если версия 5, то придется городить велосипед с пользовательскими переменными.
    Ответ написан
    4 комментария
  • Как скопировать данные из 2 таблиц в одну?

    @alexalexes
    Правильно построить выборку из нужных таблиц.
    INSERT into archive (title_product, title_category, price_product) 
    SELECT p.title, c.title, p.price
      from product p
       join category c on p.category_id = c.id
    Ответ написан
    1 комментарий
  • Как найти дни рождения в json наборе?

    @alexalexes
    Лучше детей писать в отдельную таблицу.
    А если очень хочется, то только так колхозить:
    -- MySQL
    select u.user_id, child_bdays.bday
      from user u,
            JSON_TABLE(u.children, '$[*]' COLUMNS (
                    bday VARCHAR(10)  PATH '$'
             )) child_bdays
           where STR_TO_DATE(child_bdays.bday, "%Y-%m-%d") >= DATE(now() - INTERVAL 7 DAY)
             and STR_TO_DATE(child_bdays.bday, "%Y-%m-%d") <= DATE(now() + INTERVAL 7 DAY);
    
    -- MariaDB
    select u.user_id, JSON_EXTRACT(u.children, concat('$[', idx_table.idx, ']')) as bday
      from user u,
         (select 0 idx union select 1 union select 2 union
          select 3 union select 4 union select 5 union
          select 6 union select 7 union select 8 union
          select 9 union select 10 union select 11) idx_table /* впомогательная выборка для генерации индексов в диапазоне 0...11 */
      where idx_table.idx < json_length(u.children) /* отсекаем обращения к несуществующим индексам элементов в JSON*/
        and STR_TO_DATE(JSON_EXTRACT(u.children, concat('$[', idx_table.idx, ']')), "%Y-%m-%d") >= DATE(now() - INTERVAL 7 DAY)
        and STR_TO_DATE(JSON_EXTRACT(u.children, concat('$[', idx_table.idx, ']')), "%Y-%m-%d") <= DATE(now() + INTERVAL 7 DAY)
    Ответ написан
  • Как взять значение с определенного поля и изменить другое определенное поле на данные из первого поля?

    @alexalexes
    Как говорите, так и составляйте запрос в SQL.
    update определенная_таблица т1
    set т1.определенное_поле_2 = т1.определенное_поле_1
    where т1.определенное_поле_x = опреленное_значение -- использовать опционально для конкретных записей
    Ответ написан
  • Как перевести html в PNG?

    @alexalexes
    Есть такая библиотека. HTML загоняет в canvas, а из него уже можно любой графический бинарник выдернуть.
    https://html2canvas.hertzen.com
    Ответ написан
    Комментировать
  • Как лучше сравнить два файла изображения?

    @alexalexes
    Фишка хэширования в том, что вы считаете его ровно один раз, и при повторном сравнении уже оперируете им, а не содержимым файла.
    У вас есть 1 млн. файлов. При получении каждого файла вы подготовили для него хэш и сохранили этот хэш в отдельном массиве в оперативной памяти, в файле на диске или в таблице базы данных.
    Когда поступит следующий файл, то вы от него тоже получите хэш, но при сравнении вам уже не надо вычитывать 1 млн. файлов, чтобы сделать сравнение, достаточно обратиться к более быстрому источнику за хэшами этих файлов, сравнение которых будет короче и перебор быстрее (если эта база данных, то должны использоваться индексы, если оперативная память, то сбалансированные деревья и бинарный поиск и т.п.).
    Ответ написан
    1 комментарий
  • SQL View против отдельных запросов с JOIN's?

    @alexalexes
    SQL View применяется в первую очередь, если некоторым пользователем нужно предоставить сводные сведения из закрытых для них таблиц, исключив доступ ко всем колонкам таблицы, либо предоставить только агрегированные сведения (count-ы, суммы, средние) и тд, не предоставляя доступ к исходной выборке.
    Делегировать сводные данные другому пользователю, но не давать исходники данных - это как раз про представление.
    В моем понимании, только в одном случае представление может поднять производительность. Если в выборке будут данные из редко изменяемых таблиц или колонок, а СУБД умеет отдельно кэшировать представление и имеется возможность настроить кэш, тогда можно сделать быстрые источники данных на представлениях, основанных на редко изменяемых таблицах. Самый яркий пример - получение древовидной структуры организации со сведениями о начальниках подразделений. Такой запрос отягощен рекурсивностью, а данные редко изменяются. Можно из такого запроса сделать вью и правильно закэшировать. И использовать структуру организации в других запросах станет проще, однотипно, и возможно, более производительнее.
    Ответ написан
    Комментировать
  • Как сделать запрос к самой базе данных (SQL)?

    @alexalexes
    MySQL. Если хоть раз открывали phpmyadmin и видели в списке схем information_schema. То это оно, что вы ищите. В этой схеме лежит весь конструктив базы. Туда и нужно обращаться, чтобы вытащить сведения об архитектуре.
    Select distinct table_schema, table_name
    from information_schema.colums
    where column_name = 'имя поля'

    Oracle. Тоже есть некоторые "супер-таблицы" со сведениями о структуре:
    SELECT table_name, column_name, data_type, data_length
    FROM USER_TAB_COLUMNS
    WHERE column_name = 'имя поля'

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

    @alexalexes
    Просто взял регулярку из ответа.
    <a\s.*?href="(.+?)".*?>\[photo-.+<\/a>
    И методом тыка подобрал в онлайн редакторе.
    Ответ написан