Оптимизация работы подзапросов

246
08 марта 2018, 09:12

Здравствуйте! Друзья, столкнулся со следующим вопросом. Есть запрос:

SELECT ol.id, IF(ol.id_user = 0, ol.name, (SELECT user.name FROM USER WHERE id = ol.id_user)) AS name_user FROM order_list ol WHERE ol.status = 0 ORDER BY ol.id DESC

Как видите, он возвращает id и name_user (которое берется в зависимости от условия). В случае ложности конструкции IF происходит подзапрос который возвращает имя пользователя из таблицы user. Но что делать если мне нужно получить еще и поля phone, email и тд. из таблицы user? Логично предположить, что можно просто дополнить запрос еще конструкциями IF и подзапросами, например:

SELECT ol.id, IF(ol.id_user = 0, ol.name, (SELECT user.name FROM USER WHERE id = ol.id_user)) AS name_user, IF(ol.id_user = 0, "phone", (SELECT user.phone_number FROM USER WHERE id = ol.id_user)) AS phone_user, IF(ol.id_user = 0, "email", (SELECT user.email FROM USER WHERE id = ol.id_user)) AS email_user FROM order_list ol WHERE ol.status = 0 ORDER BY ol.id DESC

Но это жутко затратно, как результат по мере разрастания данных в таблицах запрос будет выполнятся все дольше и дольше.

Как можно более элегантно решить данную проблему, подскажите пожалуйста.

Кст, было бы круто, если можно было бы как то вытащить подзапросом нужные (несколько) атрибутов и поместить их в одну переменную.

К примеру,

SELECT ol.id, IF(ol.id_user = 0, ol.name, (SELECT user.name, user.phone, user.email FROM USER WHERE id = ol.id_user)) AS data_user FROM order_list ol WHERE ol.status = 0 ORDER BY ol.id DESC

Answer 1

Дошел к ответу сам :) Данный запрос можно реализовать с помощью LEFT JOIN

SELECT ol.id AS orderId, ol.id_user AS userId, IF(u.name IS NULL, ol.name, u.name) AS userName FROM order_list ol LEFT JOIN USER u ON ol.id_user = u.id

READ ALSO
Не запускается mysql на mamp pro

Не запускается mysql на mamp pro

Привет парни, столкнулся с проблемой не запускается mysql на mamp pro 42 , вот лог ошибок

275
Оптимизация запроса c кучей join-ов, Mysql

Оптимизация запроса c кучей join-ов, Mysql

У меня супер кул расчудесный запрос )

242
Выборка только с определенными связями

Выборка только с определенными связями

Данный вариант не подходит потому что будут выбирать все записи в которых есть связи с id 3 или 4 или 5А нужно выбирать запись только если есть...

262
CGI-программа на С#

CGI-программа на С#

Извиняюсь за неразборчивость, так как столкнулся с этим впервые и мало что в этом понимаю

272