Используйте EXPLAIN
, чтобы увидеть план выполнения запроса. MySQL может выполнить этот подзапрос для каждой строки, возвращаемой внешним запросом, это будет допустимо. Поскольку это не коррелированный подзапрос, вполне вероятно, что MySQL оптимизирует его, выполняя подзапрос один раз, и кеширует результат, и возвращает кэшированное значение для каждой строки.
Обратите внимание, что если этот подзапрос когда-либо будет вернуть более одной строки, тогда весь оператор выдаст ошибку. Подзапрос в списке SELECT должен включать какую-то гарантию того, что он не вернет более одной строки. Либо агрегат в списке SELECT (например, SELECT MAX(status)
), либо предложение LIMIT 1
.
ПРИМЕЧАНИЕ:
Хранить атрибут age
обычно плохая идея. Возраст человека определяется как разница в годах между датой рождения и текущей датой. Если мы хотим установить возраст «по состоянию на» конкретной даты, мы используем эту дату вместо текущей даты.
Моим личным предпочтением было бы избегать выполнения подзапроса в списке SELECT и выполнять присоединиться к встроенному представлению, которое возвращает статус по умолчанию.
В: Можете ли вы привести пример достижения вышеуказанного с помощью объединения?
Вот пример :
SELECT t.firstname AS `first_name`
, TIMESTAMPDIFF(YEAR,t.dob,DATE(NOW())) AS `age_yrs`
, IFNULL(t.studentstatus,s.default_status) AS `status`
FROM `Student` t
CROSS
JOIN ( SELECT MAX(d.status) AS default_status
FROM `Statuses` d
WHERE d.default = TRUE
) s
ORDER
BY t.firstname