Ответы пользователя по тегу MySQL
  • Возможно объединить 2 запроса в 1?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Не зная точно структуры таблиц и уникальных индексов, ответить однозначно невозможно.
    В целом не советую заниматься таким, перегруженные по логике запросы практически всегда оказываются медленнее чем 2 раздельных запроса.
    Ответ написан
    Комментировать
  • PHP. Как очищать массив цикле?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    while($row = $STH->fetch()) {
    это цикл по всем кортежам ответа.
    сразу после этой строчки добавьте
    $test = [];
    Ответ написан
    1 комментарий
  • Как создать правильный SQL-запрос с группировкой и условием?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    1. SELECT ... COUNT(b.lot_id) ... group by b.lot_id - всегда будет 1.
    Вряд ли вам нужна группировка по lot_id.

    2.
    WHERE NOW() BETWEEN l.created_date AND end_lot_date
    - не будет использовать индекс, лучше явно писать
    WHERE l.created_date <= NOW()  AND end_lot_date >= NOW()


    3. Когда вы пишите запрос с group by - любые выбираемые данные должны быть или явно указаны в group by, или обернуты какими-то аггрегирующими фунциями (count, avg, max, group_concat итд). Иначе SQL тупо не понимает что ему делать с этим.

    Приведу пример для наглядности:
    name  | age
    Петя  | 10
    Вася  | 10

    select age, name from ... group by age.
    В postgress/mssql/oracle это будет ошибка.
    MySQLс дефолтными настройками проглатывает такой запрос, отдавая кортеж в котором age = 10, а name = случайное значение из подходящих name.
    К счастью в MySQL есть замечательный параметр sql_mode который можно установить в only_full_group_by и все начнет работать как у взрослых. (что и произошло в вашем случае, судя по логу)
    Ответ написан
    2 комментария
  • Как оптимизировать запрос?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    как то это прям уныло.

    1. Вы джойните таблицу type по id и тут же по нему фильтруете - фильтруйте сразу по event.type, таблица type вообще не нужна

    2. Если нужно за несколько месяцев, то с точки зрения быстродействия, самое быстрое решение выборка
    select DATE_FORMAT(event .dtr,"%Y-%m"), event.type, sum(event.summ),
    from event 
    where event  dtr between ... and ...
    group by DATE_FORMAT(event .dtr,"%Y-%m"), event.type, sum(event.summ)

    и дальше на любом ЯП это обрабатывать.
    Ответ написан
    7 комментариев
  • Mysql как сделать чтобы id только росло?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    AUTO_INCREMENT
    Ответ написан
    Комментировать
  • Какой sql запрос выполнится быстрее?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    START TRANSACTION;
    select * from users where id = 54 FOR UPDATE
    //проверка бизнес логики на наличие денег
    update `users` set `balance` = `balance` - 150 where `id` = 54;
    COMMIT;


    Запрос "where `id` = 54 and `balance` >= 150" - опасен.
    Innodb лочит не конкретные записи, а диапазоны индексов - при таком запросе в блокировку будут попадать все записи с балансом >= 150, со всеми вытекающими.
    Ответ написан
    Комментировать
  • Можно ли сделать auto_increment относительно другого поля?

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

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    select 
       (SELECT count(*) FROM `....` WHERE ...) / (SELECT count(*) FROM `...` WHERE ...) as rate
    Ответ написан
    Комментировать
  • Добавить данные в mysql в цикле?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    your_uncle такое ощущение что вы не пробовали читать свой собственный код.
    при чем тут тексты запросов?
    Команда mysqli_query($link, $query) отправляет $query на исполнение.
    Все что было записано-перезаписано в $query до этого абсолютно не важно.
    Важно только что там хранилось конкретно в момент вызова mysqli_query.

    вам нужно вместо строчки print_r($arr); поставить mysqli_query и все будет работать (разумеется если у вас правильная структура таблицы, итд)
    Ответ написан
    1 комментарий
  • Select ... in share mode - Как это понимать?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Ответ написан
    Комментировать
  • Как объединить в один запрос?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    SELECT поле1, поле2, поле3, users_2.title as user_2_title, users_3.title as user_3_title
    FROM таблица1
    left join users as users_2 on  users_2.id = таблица1.поле2
    left join users as users_3 on  users_3.id = таблица1.поле2
    WHERE поле4 = '10';
    Ответ написан
    Комментировать
  • Если способ добраться до последнего вложения без join?

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

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

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Федеративное устройство разных стран сильно отличается.
    Я бы хранил раздельными полями страна - область - район - тип населенного пункта - название.
    стоит ли приводить эту таблицу к 3нф или хранить денормализированно - прямо зависит от того сколько у вас этих пунктов и как оперативно вы новые подключаете.
    Ответ написан
    Комментировать
  • Правильно ли организована БД?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Таблица врачей - ок.
    Таблица категорий - ок.

    В реальном мире связь между ними many2many.

    Дальше тоньше.
    Я бы делал слоты для записи отдельной таблицей, в которую писал datetime начала и datetime окончания слота.
    Слоты генерим кроном на N суток вперед.

    Правила генерации слотов - храним в каких то отдельных таблицах, - точная структура зависит от того, насколько гибко хочется это все настраивать.

    Ну и соответственно отдельная таблица для талонов.

    Связь между слотами и талонами many2one, т.к талоны в реальности могут отменяться итд.
    Ответ написан
  • Как составить запрос один ко многим?

    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
    Ответ написан
    Комментировать
  • Как объеденить колонки?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    WHERE обрабатывается ДО формирования кортежей, соответственно concat_url просто не определен в этот момент.
    Вариантов в лоб два:
    a) использовать HAVING вместо WHERE
    b) в запросе вместо concat_url писать само выражение WHERE CONCAT(c.id,'-',c.url) = ...

    Но в любом случае лучше так никогда не делать.
    Получившийся запрос не будет использовать никакие индексы.
    Правильно - добавить UNIQUE KEY (id, url) и искать WHERE id = ... AND url = ...
    Ответ написан
    Комментировать
  • Как лучше устроить базу данных?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Увеличивать количество столбцов до бесконечности - bad design.
    Делать отдельные таблицы на разные виды товаров - получше, но не гибко.

    я бы сделал 4 таблицы:

    1. товары
    id_товара, id_категории, название товара

    2. свойство
    id_свойства, название свойства

    3. значение свойства у товара
    id_товара, id_свойства, значение

    4. возможные свойства категории
    id_категории, id_свойства

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

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Не очень понял описание, с живыми примерами было бы понятней.
    Модификации у всех товаров одинаковые?
    Т.е условно - у всех товаров модификация №1 - цвет, значение 1 - красный, 2 - синий итд?

    В таком случае храним 5 табличек - справочников с расшифровкой значений модификаторов.
    В таблице товаров храним 5 полей со значениями этих модификаторов
    Ответ написан
  • JSON тип данные в MySQL, в чем минус?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    По большому счету это денормализация базы.
    Денормализацию стоит применять когда Вы 100% понимаете что делаете, получая в каких-то конкретных условиях ускорение каких-то конкретных запросов, взамен теряя в гибкости при дальнейшей разработке и в производительности во всех остальных местах.

    Попробую расписать на Вашем примере (хранить категории поста в свойстве поста в json) чтобы было понятней:

    Тут все отлично пока Вам просто нужно выводить категории у поста.

    Как только нужно искать по категории - начинаются проблемы, какой нибудь JSON_CONTAINS - будет дико медленным на нормальном объеме данных (ведь ему нужно выполниться для каждой строки таблицы, а индексов то и нет).

    Решение - заводить еще одну денормализованное свойство для категорий - в котором хранить id постов.
    Но дальше всплывают новые задачи которые в нормализованной базе решаются за 5 секунд, а в денормализованной - нужно опять же кодить:
    - поиск по нескольким категориям сразу
    - расчет количества постов у категорий
    - итд итп.

    К чему это я все?
    К тому что используйте 3 НФ, и только когда упретесь в реальную производительность базы - начинайте думать про денормализацию.
    Ответ написан
    Комментировать
  • Как лучше хранить дату в MySQL?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    DATETIME !
    Ответ написан
    Комментировать