Ответы пользователя по тегу MySQL
  • Как правильно составить алгоритм?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Из множества строк первой таблицы вычитаем множество строк второй таблицы и результат записываем в третью таблицу. В MySQL это делается единственным SQL-запросом INSERT ... SELECT. Но так как в MySQL не реализована SQL-команда EXCEPT (разность множеств), то используется её эмуляция стандартным приёмом (описываемом в любом учебнике) через LEFT JOIN и IS NULL:

    INSERT INTO table3
    SELECT table1.*
    FROM table1
    LEFT JOIN table2
      ON table1.id = table2.id
    WHERE table2.id IS NULL
    Ответ написан
    Комментировать
  • Как сохранять emoji utf8mb4 в mysql на shared хостинге?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Чтобы сохранять символы с кодами больше 0xFFFF недостаточно задать кодировку сессии, необходимо чтобы таблицы базы данных имели кодировку utf8mb4. Пересоздай таблицы БД с явным указанием кодировки utf8mb4.

    Но учти, что максимальная длина индексного значения в БАЙТАХ при этом не меняется. Потому, если у тебя есть индексы по полям типа VARCHAR, то для utf8mb4 (4 байта на символ вместо 3 у utf8) длина этих полей не должна превышать 191 символ (255*3/4).
    Ответ написан
    1 комментарий
  • В чем может быть ошибка при хранении yii 1 сессий в БД?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Какой, на хрен, INT с автоинкрементом??? Ты документацию на CDbHttpSession вообще хоть раз смотрел? Там чёрным по белому написано, какие типы должны иметь поля таблицы хранения сессий. Поле id хранит php'шный идентификатор сессии и потому должно иметь тип CHAR(32).
    Ответ написан
    Комментировать
  • Как сделать экпорт в кодировке utf8 из большой БД MySQL с помощью mysqldump?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Возьми любую систему управления MySQl - от PhpMyAdmin до dbForge Studio for MySQL - и делай дамп ей.

    А если у тебя в БД триггеры есть, то dbForge Studio создаст дамп, который будет с этой стороны совершенно безопасен (никаких повреждений данных от сработавших во время восстановления триггеров).
    Ответ написан
    1 комментарий
  • Как правильно построить архитектуру БД?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    В таблицах Event и User должно быть по строковому полю - имя файла. И всё. Городить же дополнительные таблицы - это бессмысленно усложнять ту самую архитектуру БД.

    Если уж тебе так хочется сделать централизованное хранилище картинок - делаешь в Event и User по полю file_id, ссылающихся на таблицу File. Но никаких ссылок на Event и User в таблице File вообще быть не должно. Тебе надо выбрать картинку при отображении записи - это делается связью из Event/User к File. Для каких задач тебе может потребоваться связь в обратную сторону?

    N.B. Чтобы определить - принадлежит ли файл пользователю - не требуется связь из File к User, достаточно связи из User к File.
    Ответ написан
    Комментировать
  • Как правильно выполнить этот запрос к MySQL?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    @dez-fafara абсолютно прав. Но набор однотипных OR'ов лучше заменять на IN:
    SELECT * FROM `products` WHERE `available`='1' AND `sex` IN ('0', '2') ORDER BY `order`
    Ответ написан
    Комментировать
  • Почему появляется ошибка mysqli error #1054?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    А кавычки вокруг test где? Твой второй вариант создаёт запрос:

    $data = $db->query("SELECT `price` FROM `price` WHERE `name` IN(test,test2,test3)");

    Что, очевидно, не равно первому варианту.

    P.S. Неужели так сложно набрать
    var_dump("SELECT `price` FROM `price` WHERE `name` IN(".implode(',', $name_id).")");
    и самому посмотреть, что получается?
    Ответ написан
    Комментировать
  • Как сделать запрос SQL?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    ИМХО, у @alexclear переусложнено. Можно проще:

    SELECT a.* FROM Apartment a
      LEFT JOIN Apartment_Dates ad
        ON ad.apartment_id=a.id AND ? BETWEEN ad.arrival_time AND ad.departure_time
      WHERE ad.id IS NULL

    Что касается решения @Serhioromano, то в MySQL есть такая неприятная особенность: конструкция IN (SELECT ...) вычисляется для каждой строки выбираемой таблицы. Т.е. если в таблице Apartment 1000 записей, то (SELECT FROM Apartment_Dates) при выполнении запроса будет вычислено 1000 раз. Понятно, что работает это намного медленнее, чем JOIN и exists().
    Ответ написан
    5 комментариев
  • Как быстрее выбрать изображения из БД (mysql php)?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Быстрее всего будет работать вариант, когда имена файлов изображений хранятся непосредственно в таблице "лот" - чтобы JOIN вообще не было. Будет ли это 10 полей типа VARCHAR, или одно поле, хранящее сериализованный массив - не принципиально.

    Но хранить, разумеется, надо именно имена файлов, а не сами файлы.

    @kaasius прав в том, что картинки надо раскидывать по множеству папок. Но должно быть 2 уровня папок, а не один и в механизме распределения он ошибается. Раскидывать надо не по id, а случайным образом. Например, взять md5(uniqid($id_лота, true)) и первые 3 символа использовать в качестве имени папки, а следующие 3 - в качестве имени подпапки. Получится что-то вроде /images/48e/da3/имя_файла.
    Ответ написан
    Комментировать
  • Как сортировать список, взятый из БД, по месяцу и дню?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    1. Если ты хочешь отсортировать именно по месяцу и дню без года, то какого чёрта добавляешь в шаблон форматирования даты %Y?

    2. Если же ты сортируешь по полной дате и поле bd имеет тип DATE, DATETIME. TIMESTAMP и т.п. (т.е. тип, предназначенный для хранения даты) то никаких извращений с DATE_FORMAT не требуется - просто ORDER BY bd DESC.

    3. Для ситуации, когда поле не заполнено, в SQL если специальное значение NULL. Костыли в виде bd!='0' - ещё один бред.
    Ответ написан
    4 комментария
  • Стоит ли в MySQL разделять таблицы по разным БД?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    В MySQL (к другим СУБД это не относится) в запросе возможно указать базу данных. Более того, в одном запросе может быть обращение к таблицам разных БД. Разумеется, если все они работают на одном сервере.

    Т.е. безо всяких дополнительных соединений можно сделать:

    INSERT INTO base1.table1 (field2) SELECT base2.table2.field2 FROM base2.table2;

    Таким образом, никаких проблем с разделением таблиц по нескольким базам нет. И несколько соединений тоже не требуется.

    Если же базы будут работать на разных серверах, то да - понадобится по одному соединению на сервер. Что тоже проблем не вызовет.
    Ответ написан
    Комментировать
  • Как реализовать цикличный алгоритм расчета даты в php?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Посмотри на функцию getdate - возвращаемые элементы wday и mday помогут решить задачу.
    Ответ написан
    Комментировать
  • Какой грид посоветуете php mysql?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    И в чём проблема? JQuery + PHP + 2-4 часа для написания собственного велосипеда. Тривиальная задача, присутствующая в любом учебнике.

    Не хочешь думать - ставь Yii: там утилита gii автоматом сгенерирует тебе CRUD-интерфейс, решающий данную задачу.
    Ответ написан
    Комментировать
  • Как организовать базу данных?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Применительно к структуре таблиц, предложенной sayber: добавь в questions поле count типа int со значением по умолчанию 0, а на таблицу answers (должна быть InnoDB) повесь триггеры:

    DELIMITER $$
    
    CREATE DEFINER = 'root'@'%' TRIGGER answers_after_insert
    AFTER INSERT ON answers FOR EACH ROW
    BEGIN
      UPDATE questions
      SET questions.count = questions.count + 1
      WHERE questions.question_id = NEW.question_id;
    END
    
    $$
    
    CREATE DEFINER = 'root'@'%' TRIGGER answers_after_delete
    AFTER DELETE ON answers FOR EACH ROW
    BEGIN
      UPDATE questions
      SET questions.count = questions.count - 1
      WHERE questions.question_id = old.question_id;
    END
    
    $$
    
    DELIMITER;


    В этом случае поле questions.count автоматически будет содержать точное кол-во ответов на вопрос и фильтрация/сортировка по кол-ву ответов становится тривиальной.
    Ответ написан
    Комментировать