Профиль пользователя заблокирован сроком с 25 апреля 2024 г. по 27 апреля 2024 г. по причине: Накрутка вклада
Ответы пользователя по тегу SQL
  • Как сделать такой сложный запрос из нескольких параметров?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Я полагаю что у вас в условиях опечатка и option_id все-таки уникально описывает возможный параметр.
    Если это не так, мои запросы нужно будет переписать под уникальное условие (ну или навести порядок в структуре данных что больнее, но в целом правильнее)

    Самый простой вариант решения:
    select product.* from product where
    product_id in ( select product_id from product_options where option_id = 5 and option_value = "Красный" )
    and 
    product_id in ( select product_id from product_options where option_id = 6 and option_value = "35" )

    В ряде случаев может быть выгоднее с точки зрения быстродействия делать подзапросы на получение id отвечающих каждой категории отдельно, а объединять их на языке программирования.
    Заодно это позволит делать нечеткий поиск, например когда совпадения не полные.

    Если хочется поизвращаться можно поэкспериментировать с запросом вида
    select product.product_id, count(product_options.id) cnt from product 
    join product_options on product_options.product_id = product.product_id AND ((option_id = 5 and option_value = "Красный" ) or (option_id = 6 and option_value = "35" ))
    group by product.product_id
    having cnt = 2

    На ряде запросов это может быть быстрее

    PS Вообще есть мнение что решать это на Sql в реальном проекте не очень правильно с точки зрения нагрузки, лучше какой-нибудь elastic search прикрутить.
    Ответ написан
  • Выборка из базы данных по 4 таблицам?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    А в чем проблема просто аккуратно перечислить в запросе все что вам нужно
    select 
       ...
    from job
    join status on status.jobID = job.jobID
    join worker on worker.workerID = status.workerID
    join client on client.clientID = client.clientID 
    join responsible on responsible.responsibleID = job.responsibleID
    Ответ написан
    Комментировать
  • Как искать в базе данных SQL по группам?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    select 
       name
    from table
    where 
       (element = "Ag" and Min <= 0.007 and 0.007 <= Max)
       OR
       (element = "B" and Min <= 0.002 and 0.002 <= Max)
       OR
       (element = "Fe" and Min <= 0.06 and 0.06 <= Max)
       OR
       (element = "Mg" and Min <= 0.025 and 0.025 <= Max)
       OR
       (element = "Cu" and Min <= 0.01 and 0.01 <= Max)
    group by Name
    having count(ID) = 5

    где 5 - количество условий
    Ответ написан
    1 комментарий
  • Mysql как сделать чтобы id только росло?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    AUTO_INCREMENT
    Ответ написан
    Комментировать
  • Можно ли сделать auto_increment относительно другого поля?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Средствами mysql - нет.
    Ответ написан
    Комментировать
  • Развертка дампа БД, как делать правильно?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Для начала:
    установите в настройках сервера innodb_flush_log_at_trx_commit = 0
    проверьте значение innodb_buffer_pool_size - вам можно ставить 12GB смело

    ну и в целом советы из гугла:
    Make InnoDB access all your cores
    Increase innodb_buffer_pool_size to 12G
    Increase innodb_buffer_pool_instances to 2 (First run numactl --hardware to determine the number of Physical CPUs. What every number of CPUs it reports, use that number. I learned this recently in Jeremy Cole's Blog)
    Increase Log File Size (innodb_log_file_size) to 2047M
    support separate tablespace files for individual InnoDB tables (enable innodb_file_per_table)
    support either high performance or high durability (ACID Compliance)
    Increase Size up the innodb_log_buffer_size in conjunction with the number of transactions per second (perhaps 32M)
    Increase innodb_read_io_threads to 64
    Increase innodb_write_io_threads to 64
    Increase innodb_io_capactity to 10000


    делаете Вы все правильно, скорее всего все в диск упирается на ноуте - в этом случае innodb_flush_log_at_trx_commit = 0 и большой innodb_buffer_pool_size может помочь
    Ответ написан
  • Если способ добраться до последнего вложения без join?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Вариантов ровно 2:
    a) вы делаете один запрос с join
    b) вы делаете 4 запроса по очереди к каждой из таблиц.

    Как правило вариант А правильней.
    Ответ написан
    2 комментария
  • Как составить запрос один ко многим?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Да ладно вам, простой запрос же.

    select
    	films.*
    from meta
    left join films on films.id = meta.id_films
    where meta_value in (13,15,27)
    group by id_films
    having count(meta.id) = 3

    В IN подставляете все нужные категории
    having count = общее количество категорий запрошенных пользователем.

    Если нужен не четкий поиск, можно например сделать вот так:
    select
    	films.*,
    	count(meta.id) as cnt
    from meta
    left join films on films.id = meta.id_films
    where meta_value in (13,15,27)
    group by id_films

    и дальше показывать юзеру по убыванию cnt
    Ответ написан
    Комментировать
  • Как оптимизировать этот SQL запрос?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    1. Убедиться что есть индекс в таблице etsy_order_detailsпо order_id.
    2. В порядке бреда убедиться что в таблицах usersи billing_statementsесть индекс по id.
    3. Если не поможет - выкладывайте результаты show create table используемых таблиц и explainвашего запроса.
    Ответ написан
    Комментировать
  • Как правильно написать SQL запрос с под-select'ом?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Ваше желание обусловлено неправильно спроектированной базой.
    Почитайте про 3ю нормальную форму таблиц.

    В данном случае нужно:

    a) есть у task строго 1 или 0 картинок, картинки и бывают только в tasks:
    добавить в uploads поле task_id

    b) иначе:
    завести новую таблицу xref_task_upload вида (task_id, upload_id)
    Ответ написан
    Комментировать
  • Как вывести списки с постраничной навигацией для базы в 2 млн записей?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Это каноническая задача на самом деле.
    Дело в том, что для обработки offset 400 000 - sql сервер должен фактически найти 400 000 записей удовлетворяющих условию, отбросить их и дальше уже вывести результат.

    /tmp при этом переполняться по идее не должен, могу предположить что серверу тупо не хватает памяти.
    Покрутите mysqltuner какой-нибудь.

    Нормальных решений проблемы нет, есть обходные пути:
    1) Вводите какой-то неразрывный индекс удовлетворяющий выборке, вместо limit делаете where tmp_id between 400000 and 400100 - в вашем случае вероятно не подойдет.
    2) Придумываете какой-то альтернативный способ пагинации опять же без offset - например перебор дат записей или еще что-то.
    3) Задаетесь глобальным вопросом нафига вообще пагинация на 400 000 записей и отказываетесь от неё :-D
    Очевидно что пользователь такое количество записей не воспримет никогда, так что пусть уточняет запрос.
    Ответ написан
  • Как построить запрос sql?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    select uid, text from (select uid, max(id) from `table` group by uid) tmp 
    join `table` on tmp.uid = table.uid
    Ответ написан
    Комментировать
  • Как правильно оптимизировать Mysql запрос?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Медлено у Вас все потому что вы перечисляете 2 таблицы подряд, получая полное произведение матриц в размере 1kk * 400k = 400kkk записей.
    Все равно что "from a, b" написать.

    Правильный запрос
    UPDATE TABLE sp_germany AS a 
    JOIN TABLE sp_germany_small  AS b ON b.product_artikul = a.product_artikul
    SET a.product_price = b.product_price

    Ну и индексы по полю product_artikul должны быть в обеих таблицах.
    Ответ написан
    2 комментария
  • Как написать запрос?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    То что Вам нужно называется транспонирование матрицы, mysql это не умеет.

    Выбирайте select * from table where name = ... и собирайте нужную вам структуру в любом яп.
    Ответ написан
    Комментировать
  • Как добавить сортировку по значению ячейки в столбце в select запросе?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    1. За order by rand() нужно убивать.
    Гуглите, вопрос "как выбрать случайные значения" не обсуждал только ленивый, на хабре статей море.

    2. Как раз 1к строк великолепно можно на php сортировать, нюансы начинаются когда строк больше на 1-2 порядка.

    3.
    WHERE coll='чето там' and not (coll = 'asd' or coll like 'asss%' )
    Ответ написан
    1 комментарий
  • Sql взять подстроку используя Regexp?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    stackoverflow.com/questions/33874402/sqlite-regula...
    можно написать запрос вида
    select (select ... ) as a, (select ... ) as b, ...
    но imho проще порезать на любом ЯП
    Ответ написан
    Комментировать
  • Как оптимизировать такой SQL запрос?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Жесть на самом деле ;-)

    Смотрите, начнем с того что каждый join это произведение матриц. Есть смысл как можно более сильно зарезать условие join, те вместо
    LEFT JOIN oc_product_attribute p2a0 ON (p2a0.product_id=p2a.product_id)

    писать
    JOIN oc_product_attribute p2a0 ON (p2a0.product_id=p.product_id and p2a0.attribute_id = 12 AND p2a0.text LIKE '%ЛПО%')

    Обратите внимание что я ссылаюсь на таблицу p - в ней уже есть product_id
    И убеждаемся что в oc_product_attribute есть индекс (product_id, attribute_id, text)

    Далее:
    Хороший способ оптимизировать запросы - разбить их на несколько, в данном случае это вполне возможно.
    6 запросов вида
    select product_id from oc_product_attribute p2a0 where (p2a0.product_id=p.product_id and p2a0.attribute_id = 12 AND p2a0.text LIKE '%ЛПО%')

    Дальше в ЯП выбираем product_id которые есть во всех 6 выборках.
    Дальше
    select * from oc_product  where product_id IN (1,2,3 ...)
    Ответ написан
    Комментировать
  • Как ограничить количество записей в таблице с определенным полем?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    start transaction
    select count(*) from ... where user_id = ... for update

    и дальше на ЯП смотрим - можно вставлять или нет.
    Ответ написан
    Комментировать
  • Как производить выборку постов и тегов из Б.Д.?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Очень люблю задавать этот вопрос на собеседованиях)
    Правильный на мой взгляд ответ: в зависимости от нагрузки.
    1. Очевидное быстрое решение - тупо 3НФ в базе, 1 запрос на получение списка постов, еще 1-2 запроса на получение всех тегов из всех этих постов, мерж массивов на ЯП.
    2. По мере появления нагрузки можно заниматься различными денормализациями (как минимум можно денормализованно хранить id тегов, как максимум и текстовки тегов тоже).
    Ответ написан
    5 комментариев
  • Где скачать базу данных регионов и населенных пунктов России?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    fias.nalog.ru/Updates.aspx

    UPD
    Дополню: КЛАДР о котором пишут в соседних ответах - это не старый формат, это другой формат, хотя и являющийся предшественником ФИАС. Оба справочника являются пополняемыми и обновляемыми, оба содержат косяки и ошибки причем как общие, так и персонально свои.
    На уровне работы с регионами и городами - проблем особых нет (не считая идиотского устройства городов нашей страны, когда город может являться частью другого города находясь в десятке километров, а поселок находящийся в черте города может быть обособленным), а вот на уровне улиц/домов опечатки бывают достаточно часто.
    Ответ написан
    Комментировать