ВЫБЕРИТЕ несколько запросов с несколькими предложениями where - PullRequest
0 голосов
/ 10 июня 2019

У меня есть два запроса на выборку, которые я хочу объединить для повышения производительности.Я немного сбит с толку, так как не уверен, что могу использовать JOIN или LEFT JOIN или что-то еще, чтобы ускорить его.

Вот два запроса, которые я хочу объединить:

Запрос 1:

SELECT id FROM users WHERE email = :email LIMIT 1

Затем, если эта строка существует из запроса 1, выполните запрос 2:

SELECT * FROM settings WHERE id = :id_from_query_1

спасибо за любую помощь!

Ответы [ 5 ]

1 голос
/ 10 июня 2019

При выполнении запроса присоединения вы можете указать, к какому столбцу присоединиться.В этом случае это будет:

select users.id, settings.*
from users
join settings on users.id = settings.id

Вы также можете использовать двойное предложение from, которое, я думаю, приводит к тому же самому скоростному фону, который будет выглядеть так:

select users.id, settings.*
from users, settings
where users.id = settings.id

Если заданы правильные индексы, соединение должно быть быстрее, чем 2 выбора.Конечно, когда речь идет о скорости, есть много факторов, таких как нагрузка, сеть, что кешируется, а что нет и т.д.

0 голосов
/ 10 июня 2019
Select s.* from settings s left join users u
ON u.id = s.id
Where email = :email
LIMIT 1;

Это вернет все столбцы из таблицы настроек с тем конкретным идентификатором, который имеет соответствующий «адрес электронной почты».

0 голосов
/ 10 июня 2019

Поскольку 1-й подзапрос вернет 1 строку (или ни одной):

SELECT * FROM settings 
WHERE id = (SELECT id FROM users WHERE email = :email LIMIT 1)
0 голосов
/ 10 июня 2019
SELECT u.id 
FROM users u
WHERE email = :email 
LEFT JOIN settings s 
ON u.id = s.id
LIMIT 1

Вот вам левый запрос на соединение.

0 голосов
/ 10 июня 2019

Из вашего описания, соединение должно работать. Возможно, что-то вроде этого:

select u.id, s.* from users as u join settings as s on u.id = s.id where email = ?;
...