Здравствуйте! Друзья, столкнулся со следующим вопросом. Есть запрос:
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
Дошел к ответу сам :) Данный запрос можно реализовать с помощью 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
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Привет парни, столкнулся с проблемой не запускается mysql на mamp pro 42 , вот лог ошибок
Данный вариант не подходит потому что будут выбирать все записи в которых есть связи с id 3 или 4 или 5А нужно выбирать запись только если есть...
Извиняюсь за неразборчивость, так как столкнулся с этим впервые и мало что в этом понимаю