Ответы пользователя по тегу SQL
  • Можно ли хранить SQL запрос в переменной сессии PHP?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Хранить в сессии SQL запрос вполне безопасно.

    Обычно так не делают, потому что генерация запроса занимает ничтожно малое время в сравнении с выборкой данных. Для оптимизации, лучше оптимизировать запросы, и при возможности использовать кеширование результатов запроса или контента сформированного на основе этих результатов. Кеш запросов конфигурируется в настройках сервера баз данных. Кеш на стороне бекенда, может быть как кеш результатов запросов к бд, так и кеш контента который будет на основе этих результатов сгенерирован, для этого отлично подойдет Redis и Varnish.

    Кеш непосредственно запроса, имеет смысл использовать, если для формирования конечного запроса, используются дополнительные запросы и эти запросы не поддаются кешированию на стороне бд.
    Ответ написан
    Комментировать
  • Как в MySQL сформировать запрос на выборку вложенного массива json?

    orlov0562
    @orlov0562
    I'm cool!
    Никак, или я не знаю как.

    Дело в том, что выборка data_json -> "$.books[*].id" вернет вот такое значение "[1, 2]" его некорректно сравнивать с числом.

    SELECT data_json -> "$.books[*].id" FROM test

    В MySQL 8 есть JSON_TABLE, предполагаю, что из "[1, 2]" можно сделать таблицу и уже по ней строить условие.
    Ответ написан
    1 комментарий
  • Почему вылетает ошибка "неверное регулярное выражение: quantifier operand invalid"?

    orlov0562
    @orlov0562
    I'm cool!
    Попробуй экранировать спец символы (плюсы в слове "с++")

    В справке MySQL есть пример:

    To use a literal instance of a special character in a regular expression, precede it by two backslash (\) characters. The MySQL parser interprets one of the backslashes, and the regular expression library interprets the other. For example, to match the string 1+2 that contains the special + character, only the last of the following regular expressions is the correct one:
    mysql> SELECT REGEXP_LIKE('1+2', '1+2');                       -> 0
    mysql> SELECT REGEXP_LIKE('1+2', '1\+2');                      -> 0
    mysql> SELECT REGEXP_LIKE('1+2', '1\\+2');                     -> 1


    в postgre думаю так же
    Ответ написан
    Комментировать
  • Как можно просто и удобно вставлять таблицу данных в БД SQLite3?

    orlov0562
    @orlov0562
    I'm cool!
    1) Если немножко лентяй, то напиши скрипт импорта, на любом известном тебе языке

    2) Если средне лентяй, то используй Ctrl+C/Ctrl+V в текстовый редактор (например в Kate), а дальше замену с регулярками, чтоб на выходе получились инструкции INSERT тру-ла-ла

    3) Если сильно лентяй
    - Ctrl+C/Ctrl+V в LibreOffice Calc
    - Сохранить в CSV
    - Потом импортировать из CSV через SQL Studio (вот тут есть описание с картинками)

    4) Если очень сильно лентяй, найми фрилансера, который тебе напишет скрипт за 5$
    Ответ написан
    1 комментарий
  • Присвоить id в обратном порядке?

    orlov0562
    @orlov0562
    I'm cool!
    Интересная задача, для собеседований самое-то. Самый простой способ сджойнить по счетчику строк

    Схема базы
    CREATE TABLE tmp (
      id INT,
      color VARCHAR(255)
    );


    Данные
    INSERT INTO tmp 
      (id, color)
    VALUES 
      (1, 'зеленый'),
      (2, 'красный'),
      (3, 'синий'),
      (4, 'белый')
    ;


    Запрос
    SELECT id, color FROM (
      SELECT 
        id,
        @join_pk_1:=@join_pk_1 + 1 as join_pk
      FROM tmp, (select @join_pk_1:=0) as join_pk_1
      ORDER BY id DESC
    ) as tbl1
    LEFT JOIN (
      SELECT 
        color,
        @join_pk_2:=@join_pk_2 + 1 as join_pk
      FROM tmp, (select @join_pk_2:=0) as join_pk_2
    ) as tbl2
    ON tbl1.join_pk = tbl2.join_pk


    Результат
    id 	color
    4 	зеленый
    3 	красный
    2 	синий
    1 	белый
    Ответ написан
    3 комментария
  • Как правильно организовать структуру динамических фильтров для сайта объявлений?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Смотри в сторону EAV (entity attribute value model)
    Ответ написан
    Комментировать
  • Как правильно реализовать структуру БД расписание для университета?

    orlov0562
    @orlov0562
    I'm cool!
    не вижу проблемы:

    schedule
    ============
    id
    group - название группы
    lesson - номер пары (по номеру пары, считать время при необходимости)
    title - название предмета
    teacher - имя преподавателя
    room - номер аудитории

    при необходимости, разбросать по разным справочникам, например group заменить на group_id и сделать отдельную таблицу про группу
    Ответ написан
    Комментировать
  • Какие в вашем понимании средние знания php/js/sql?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Тема слишком обширная. Я бы подели так:

    Хорошие знания = знаешь как делать, и можешь обосновать почему так, приводя в пример прошлые проекты
    Средние знания = тебе говорят как надо сделать, и ты делаешь не задавая вопросов о том как это работает
    Небольшие знания = тебе говорят как надо сделать, но ты так некогда не делал и тебе надо с этим разбираться

    Исходя из этого, средние знания я бы оценил так - тебе ставят задачу, и ты её можешь решить без доступа к справочным материалам. Например, говорят, надо разработать плагин, который wordpress превратит в инет магазин. Ты отрубаешь инет (выкачав нужные библиотеки) и все можешь сделать локально = поздравляю, ты среднячок.
    Ответ написан
    7 комментариев
  • Одна или несколько баз данных?

    orlov0562
    @orlov0562
    I'm cool!
    Моё мнение, хранить все в 1ой базе, т.к. данные связанные. 100 млн записей - это не много, особенно если бд грамотно спроектирована, есть нужные ключи и все такое. Разносить будет смысл, только когда упретесь в производительность железок и не будет другой возможности убрать проблемы производительности, кроме как разделить бд на разные сервера, но до таких проблем еще надо постараться добраться.
    Ответ написан
    Комментировать
  • Как спроектировать БД для публикации новостей?

    orlov0562
    @orlov0562
    I'm cool!
    1) У каждого пользователя, поле в таблице, в которое записывать SELECT COUNT WHERE user_id в момент обновления им новости (добавил/удалил/изменил статус). При простых условиях, можно сделать тригер в бд, который это будет делать сам. Не забудь сделать индекс по user_id

    2) Да, лучше кешировать это значение. Делается это разными способами, но смысл один - снизить кол-во вызовов SELECT COUNT

    SELECT COUNT(id) и даже SELECT COUNT(id) WHERE user_id = на небольшой посещалке не самая тяжелая операция.. Однако, если ты например решишь отсортировать пользователей по кол-ву новостей, например выбрать top 50, то имея доп. поле с кол-вом новостей, сделать это будет гораздо проще..

    В общем, ты правильно мыслишь.
    Ответ написан
    1 комментарий
  • Плохо ли делать update + если нет обновленных полей - insert?

    orlov0562
    @orlov0562
    I'm cool!
    Можно так, как ты описал, а можно INSERT IGNORE и если не было affected rows, тогда UPDATE, это должно избавить от integrity constraint.

    Лично я не знаю, чем это может быть плохо.
    Ответ написан
  • Зачем по стилю кодирования (php) конкатенация в SQL?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Ты немного неправильно понял, там ключевые моменты:
    Когда производится конкатенация строк с помощью оператора ".", разрешается разрывать..


    ну, а удобно это может быть для разных причин, например комментарии написать или закомментировать какую-то строку:

    $sql = "SELECT `id`, `name` FROM `people` "
               . "WHERE `name` = 'Susan' "
    // закомментировано на время отладки
    //           . "ORDER BY `name` ASC "
               . "ORDER BY `name` DESC LIMIT 5"
    ;
    Ответ написан
    Комментировать
  • Как составить запрос с необязательным выполнение условия?

    orlov0562
    @orlov0562
    I'm cool!
    Еще вариант:

    select * from `tFilm`
    order by 
    	case when `year` = '1998' then 1 else 2 end, 
    	case when `genre` = '4' then 1 else 2 end, 
    	case when `country` = '34' then 1 else 2 end, 
    	year,
    	genre,
    	country
    limit 10
    Ответ написан