@vista1x

Как работают представления в MySQL?

В MySQL есть представление (View), которое делает запрос с множеством JOIN, подсчетов (sum и т.п.) и возвращает нужную мне таблицу.
Допустим, возвращаемые поля такие: ID, Num, Name, Price, Discount
Сама View считает данные по всем данным из БД. А что если мне нужны не все данные, а, к примеру, где ID = N;
То есть сделав запрос
SELECT * FROM MyView WHERE ID = {variable}
я получаю нужный мне результат. Но если я правильно понимаю, сначала выполнится запрос, лежащий в представлении, и только потом, из возвращенного вьюхой результата выберется одна единственная нужная мне запись. Получается, что считаю я результаты для всех данных, а забираю только одну. Это так?

Если это так, то как следует поступать в таких ситуациях? Конечно, я могу писать отдельно запрос в приложении - но запросы получатся трехэтажные. Вдобавок к этому, представления удобны тем, что их можно использовать в других запросах, не переписывая сотни раз одни и те же формулы вычисления нужных мне данных.
  • Вопрос задан
  • 2603 просмотра
Пригласить эксперта
Ответы на вопрос 1
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;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы