Ответы пользователя по тегу MySQL
  • Как удалить первый символ media_path в таблице article_media?

    UPDATE article_media SET media_path = SUBSTR(media_path, 2);
    Ответ написан
    Комментировать
  • Как эффективно вывести статус друга?

    Исходя из собственного понимания задачи, позволю немного вмешаться в структуру
    1. Таблица пользователей
    CREATE TABLE `users` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


    2. Таблица друзей
    Добавлены внешние ключи на таблицу пользователей
    Поскольку статусов ограниченное количество, то статусы вынес в отдельные атрибуты
    CREATE TABLE `friends` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `user_one` int(11) NOT NULL,
      `user_two` int(11) NOT NULL,
      `is_accepted` tinyint(1) NOT NULL DEFAULT '0',
      `is_rejected` tinyint(1) NOT NULL DEFAULT '0',
      PRIMARY KEY (`id`),
      KEY `fk_user_one_idx` (`user_one`),
      KEY `fk_user_two_idx` (`user_two`),
      CONSTRAINT `fk_user_one` FOREIGN KEY (`user_one`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
      CONSTRAINT `fk_user_two` FOREIGN KEY (`user_two`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


    3. Запрос со статусом заявок для первого пользователя будет не очень сложным
    SELECT
        u1.name,
        IF (
            u2.id IS NOT NULL,
            IF (
                f1.is_accepted,
                CONCAT('Дружит c ', u2.name),
                CONCAT (
                    'Не дружит c ',
                    u2.name,
                    ': ',
                    IF(
                        f1.is_rejected,
                        'заявка отклонена',
                        'заявка ожидает рассмотрения'
                    )
                )
            ),
            'Ни с кем не дружит'
    	) status
    FROM
    	user u1
    LEFT JOIN
    	friends f1
        ON f1.user_one = u1.id
    LEFT JOIN
    	user u2
        ON u2.id = f1.user_two
    WHERE
    	u1.id = 1


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

    Доброго утра.

    С подготовленными выражениями не всё так просто, если использовать mysqli* (процедурный или объектный стиль).
    В вашем случае придётся разобрать, что именно написано:
    $q = "SELECT name, last_name, email FROM users WHERE id IN (?, ?)";
    
    $stmt = mysqli_prepare($link, $q);
    if (false === $stmt) {
        die('statement was executed with errors');
    }
    
    $id = 1;
    $anotherId = 2;
    
    //обратите внимание на строку типов - "ii",
    // подозреваю, что у вас ошибочно описан строковый тип "s" для id_user 
    $stmt->bind_param("ii", $id, $anotherId); 
    $stmt->execute();
    
    $stmt->store_result(); // буферизация
    echo "<br>Rows: " . $stmt->num_rows . "<br>"; // количество строк в результате
    
    // При работе с подготовленными выражениями и результатами нам нужно точно знать, что мы получаем в запросе (см. SELECT <fields>)
    // Можно получать в запросе все атрибуты, а конкретные имена атрибутов забирать через metadata
    $name = null;
    $lastName = null;
    $email = null;
    
    // Привязка переменных к результирующему набору (порядок, как в SELECT)
     $stmt->bind_result($name, $lastName, $email);
    
    // каждый вызов fetch будет связывать наши переменные и дынными из результата
    while ($stmt->fetch()) {
        var_dump([
            'name' => $name,
            'last_name' => $lastName,
            'email' => $email,
        ]);
    }
    
    $stmt->free_result(); // освобождаем память
    $stmt->close();
    $link->close();


    Ссылки: Статья на хабре, Stackoverflow

    P.S. Не вполне понятно, почему написано именно так (через mysqli*, зачем нужен store_result).
    Думаю, что сам код можно упростить если воспользоваться тем же PDO или более высокоуровневым инструментом.
    Ответ написан
    Комментировать