Ответы пользователя по тегу SQL
  • Как сконструировать запрос на вставку нескольких строк в mysqli statement?

    finnish
    @finnish
    Да, можно использовать один и тот же запрос с разными значениями, но при большом количестве строк производительность Вас может огорчить.

    А что если Вы создадите массив, куда будете писать все значения? Заполнять его будете одновременным с формированием строки запроса. Например, так:
    $sql   = 'INSERT INTO `customers` (`id`, `name`, `email`) VALUES ';
    $binds = [];
    $index = 0;
    $count = count($customers);
    foreach($customers as $customer) {
        if ($customer->id) {
            $sql .= '(?, ?, ?)';
            $binds[] = $customer->id;
        } else {
            $sql .= '(NULL, ?, ?)';
        }
        if (++$index != $count) {
            $sql .= ', ';
        }
        $binds[] = $customer->name;
        $binds[] = $customer->email;
    }
    $sql .= ' ON DUPLICATE KEY UPDATE `name` = VALUES(`name`), `email` = VALUES(`email`)';
    $query = $mysqli->prepare($sql);
    foreach($binds as $bind) {
        $query->bind_param("s", $bind);
    }
    Ответ написан
  • Как работают представления в MySQL?

    finnish
    @finnish
    Представление, это как подготовленный заранее шаблон запроса. Выполняя поиск по какому-то представлению, Вы на самом деле лишь дописываете к этому шаблону свои условия.

    Вот простой пример представления (назовём его `users_online`), которое показывает пользователей, проявлявших активность в течении последних 15 минут:
    SELECT * 
    FROM `users`    AS `u` 
    JOIN `activity` AS `a` 
    ON   `a`.`user_id`   = `u`.`id` 
    AND  `a`.`modified` >= CURRENT_TIMESTAMP - INTERVAL 15 MINUTE;

    При выборе онлайн-пользователей старше 18 лет, Ваш запрос будет скорее всего примерно такой:
    SELECT * FROM `users_online` WHERE `age` > 18;

    Что для базы данных равноценно:
    SELECT * FROM (
        SELECT * 
        FROM `users`    AS `u` 
        JOIN `activity` AS `a` 
        ON   `a`.`user_id`   = `u`.`id` 
        AND  `a`.`modified` >= CURRENT_TIMESTAMP - INTERVAL 15 MINUTE
    ) AS `users_online` 
    WHERE `age` > 18;

    В каждом конкретном случае база данных может оптимизировать запрос, и результирующим может оказаться нечто иное, но смысл от этого не меняется и описан в первом предложении моего комментария. Например, более простое представление:
    SELECT * FROM `users` WHERE `online` = 1;
    ... с Вашими условиями превратится в:
    SELECT * FROM `users` WHERE `online` = 1 AND `age` > 18;
    Ответ написан
    5 комментариев