Задать вопрос
Профиль пользователя заблокирован сроком с 17 мая 2024 г. по 17 мая 2025 г. по причине: нарушение правил сайта
Ответы пользователя по тегу MySQL
  • База недвижимости. Проектирование расположение(страна, город, ...)?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Координату хранить нужно 100% как свойство объекта, но дальше дьявол в деталях - полный адрес в каждой стране (да и даже в рамках одной страны) может задаваться оооочень сложной логикой, даже рекурсивно (в рф например может быть поселок как часть города, причем может находиться как далеко-далеко, так и внутри границ)
    Но по большому счету максимально полный адрес и не нужен, нужно чтобы было понятно пользователю + работало seo.

    С точки зрения базы:
    Координату объекта хранят все (как его свойства)
    Логично что город - отдельный объект в базе (3НФ никто не отменял), а вот какие свойства у него - зависит от бизнес-логики уже вашей.
    Циан хранит тупо название с координатами центра.
    У нас есть travel проект по всяким весям рф и сопредельных - мы храним развернутый объект страна-регион-район-тип(город,село, пгт, etc)-название-координаты, где страна/регион/район это тоже справочники в бд.

    В общем и целом алгоритм такой:
    1. выбрать используемое картографическое решение: google / osm / итд
    2. изучить их reverse geocoder, структуру его ответа
    3. на основе этого, а так же планируемого расположения объектов недвижимости определить структуру вашего гео-объекта.
    Ответ написан
    Комментировать
  • Почему не работает фильтр?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Ладно, отвечу серьезно.

    По поводу самой проблемы:
    Можно в режиме телепата гадать 100500 раз о том что происходит.
    По факту вопрос слишком абстрактный, научитесь дебажить код.

    Конкретный пример: у вас есть ваш "код фильтрации".
    Идеально было бы поставить xdebug и ide которая умеет с ним работать, но на крайний случай вас спасут print_r и var_dump.
    Прямо с начала, берете, и для каждой строчки по очереди проверяете - те ли данные вам пришли, что вы ожидали, те ли строки сформировались что вы ожидали, итд.

    Скорее всего вы поймете в чем проблема сами.
    Даже если не поймете - сможете задать уже конкретный вопрос.
    Ну и хорошо бы вывод всех ошибок и нотисов включать.
    <?php
    ini_set('error_reporting', E_ALL);
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);


    Теперь в целом по коду:
    1. Почитайте про MVC. mysqli функции вперемешку с html версткой - недопустимы.
    2. Вынесите всю работу с базой в отдельную либу. есть 100500 готовых решений на гитхабе.
    sql connect в filterTable - очень плохо.
    3. В базу нельзя отправлять user input без обработки! Как минимум нужно делать mysqli_real_escape_string
    4. За запрос where concat(`fullName`, `group_name`) = ... в реальном проекте, увольняют сразу. Запрос не использует индексы и должен для каждой строки таблицы выполнить объединение 2х полей, а потом еще и сравнить. Это дико медленно.
    Нужна такая строка для поиска - собирайте её отдельным полем в базе.
    Ответ написан
  • Возможно объединить 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 полей со значениями этих модификаторов
    Ответ написан