Ответы пользователя по тегу MySQL
  • Как реализовать редактирование уже существующих записей (программа есть но не работает)?

    @aleksmir
    Системный администратор, программист
    Тут две ошибки, первая - это при определении $note_id, должно быть так:
    $node_id = isset($_POST['id']) ? $_POST['id'] : $_GET['note'];

    Вторая, это нужно подставлять значения $_POST после перерисовки и вычисленную $node_id:
    <form method="POST">
    <p>Заголовок заметки: <input type="text" name="title"  value = "<?php echo isset($_POST['title']) ? $_POST['title'] : $edit_note['title']; ?>"/></p>
    <p>Текст заметки: <textarea name="article"><?php echo isset($_POST['article']) ? $_POST['article'] : $edit_note['article']; ?></textarea></p> 
    <input type="hidden" name = "note" value="<?php echo $node_id; ?>"/>
    <input type="submit" name= "submit" value="Изменить"/>
    </form>

    Тут тоже ошибка, она на сохранение не влияет, но вызывает ошибку выполнения, которая у вас не отображалась скорее всего потому, что вывод ошибок отключен. Можно подправить так:
    if (isset($_POST)) {
    $title = $_POST['title'];
    $article = $_POST['article'];
    $update_query = "UPDATE notes SET title = '$title', article = '$article' WHERE id = $note_id";
    $update_result = mysqli_query ($link, $update_query);
    }
    Ответ написан
    Комментировать
  • Как правильно получать дополнительные данные из соседних таблиц на странице списка?

    @aleksmir
    Системный администратор, программист
    Можно одним запросом все достать:
    SELECT `country`.`id`, `country`.`name`, `table2`.`field1`, `table2`.`field2`
    FROM `country` LEFT JOIN `table2` ON `country`.`id`=`table`.`country_id`
    ORDER BY `country`.`id`, `table2`.`field`;
    Ответ написан
    Комментировать
  • Как структурировать базу данных MySQL для онлайн записи?

    @aleksmir
    Системный администратор, программист
    Задача хитрая в том плане, что будет первое время ускользать из рук. Т.е. вам несколько раз придется улучшать логику приложения, пока придете к нужному результату. Но не бойтесь, начните с малого. Базе данных очень важно знать - какие данные вы будете хранить и в каком виде от нее получать. Остальное она все сделает сама.

    Поэтому начнем с самого простого - таблицы для хранения самой записи. Таблицу назовем `reg` от слова `registration` (Регистрация). Поле `id` - ключевое. Поле `datetime` - хранит дату и время записи. Поле `info` - произвольная текстовая информация, не длиннее 255 символов.
    CREATE TABLE `reg` (
    	`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id записи',
    	`datetime` DATETIME NULL DEFAULT NULL COMMENT 'Дата и время записи',
    	`info` VARCHAR(255) NOT NULL DEFAULT '' COMMENT 'Текстовая информация о записи' COLLATE 'utf8mb4_unicode_ci',
    	PRIMARY KEY (`id`),
    	INDEX `datetime` (`datetime`)
    )
    COMMENT='Регистрация'
    COLLATE='utf8mb4_unicode_ci'
    ENGINE=InnoDB;


    Попробовать повводить данные в таблицу можете здесь, например через программу HeidiSQL:
    - сервер: habr.atou.ru
    - порт: 3311
    - пользователь: habr_95659
    - пароль: 9D4z3R4b
    - база данных: habr_952563

    Если захотите продолжить. Помогу создать следующие таблицы.
    Ответ написан
    Комментировать
  • Возможно ли уменьшить время запроса?

    @aleksmir
    Системный администратор, программист
    Приведите пожалуйста код создания структуры таблицы pictures, тогда будет более предметный разговор. Сколько записей в таблице pictures?
    Из общих рекомендаций:
    1) `result`='WAITING' - поле должно быть проиндексировано, иначе запись ищется полным перебором всех записей;
    2) условие DATE(`date`) точно правильно написано?
    3) если ищете по дате, то поле `date` тоже должно быть проиндексировано;
    4) лучше вместо отдельных индексов использовать составной индекс INDEX `result_date` (`result`, `date`);
    5) проверьте свои запросы SELECT и UPDATE с помощью команды EXPLAIN, по ней можно будет посмотреть - где происходят тормоза;
    6) у вас в этом коде PHP происходит до 11 обращений к БД; операция UPDATE наиболее медленная, вполне вероятно, что она и выполняется в течение нескольких секунд 10 раз; но если будет индекс, то проблем не должно быть;
    7) если не поможет, то несколько запросов UPDATE можно заменить одним запросом с помощью функций обновления через условие;
    8) кстати для поля `hash` также нужен индекс, раз по нему выполняется поиск;
    9) ещё бы я рекомендовал ключ сделать числовым, т.е. `hash` заменить на поле `id` типа UNSIGNED INT AUTOINCREMENT и сделать его ключом PRIMARY KEY;
    10) поле `result` тоже нужно сделать числовым и записывать в него, например число 0, если 'WAITING' и 1, если 'PROCESS'.

    Уверен, что после выполнения рекомендаций все будет "летать".
    Ответ написан
    Комментировать
  • Почему идет долгий запрос в mysql?

    @aleksmir
    Системный администратор, программист
    Судя по структуре запроса тормоза скорее всего из-за поиска в тексте.
    1) попробуйте использовать индекс FULLTEXT
    2) проверьте на всякий случай наличие индексов на числовых полях; для анализа запроса можно использовать EXPLAIN
    3) возможно стоит, как вы и писали, нормализовать структуру таблиц, чтобы текстовый поиск поменять на поиск по ID; это был бы самый надежный способ; как например вы сделали здесь (это удачное решение):
    and class_ads.category_id in (239,241,242,243,245,246,248,249,201)

    4) в крайнем случае, когда от текстового поиска совсем не уйти, можно применить функцию CRC32(), которая подсчитывает контрольную сумму по строке и эту контрольную сумму сохранить в числовом поле `crc`, по полю построить индекс:
    CREATE TABLE `table` (
    `crc` INT UNSIGNED NOT NULL DEFAULT '0',
    `word` VARCHAR(30) NOT NULL DEFAULT '' COLLATE 'utf8mb4_unicode_ci',
    INDEX (`crc`);

    Потом в запросе искать так:
    SELECT * FROM `table` WHERE (`crc`=CRC32(`слово')) AND (`word`='слово');


    Но п.4 скорее всего не ваш случай. Я думаю п.3 (создание справочников и выполнение поиска по id) был бы лучшим решением.
    Ответ написан
    Комментировать
  • Как вставить значение в LINESTRING?

    @aleksmir
    Системный администратор, программист
    В MySQL строки объединяются функцией CONCAT()

    SET @g1 = 100;
    SET @g2 = CONCAT('SELECT LINESTRING(0 ', @g1, ', 100000 100)');
    SELECT @g2;
    Ответ написан
    Комментировать
  • Как лучше всего хранить такой набор данных?

    @aleksmir
    Системный администратор, программист
    Пишите на MySQL. Самое верное дело. Там потерь не бывает. Движок InnoDB.
    По структуре таблиц зависит от исходных данных.
    Напишите сколько у вас примерно файлов сейчас. И какой прирост - т.е. в каком количестве они добавляются ежедневно. Тогда можно будет прикинуть структуру.
    Второй вопрос - как нужно делать выборку этих строк? По текстовому поиску или ещё как-то? По заголовкам имен файлов или по всему тексту?
    Ответ написан