#mysql #join
#mysql #Присоединиться
Вопрос:
SELECT
*
FROM
`table_1`
WHERE
`id` =
(
SELECT
`an_id`
FROM
`table_2`
WHERE
`id` =
(
SELECT
`another_id`
FROM
`table_3`
WHERE
`id` =
(
SELECT
`yet_another_id`
FROM
`table_4`
WHERE
`id` = 123
)
)
)
Довольно некрасиво, не так ли?
Я предполагаю, что я мог бы использовать JOINs здесь — но как?
Ответ №1:
select t1.*
from
table1 t1,
table2 t2,
table3 t3,
table4 t4
where
t4.id = 123
and t3.id = t4.yet_another_id
and t2.id = t3.another_id
and t1.id = an_id;
Ответ №2:
Возвращает ли это те же результаты для ваших данных?:
SELECT
table_1.*
FROM
table_1
INNER JOIN table_2
ON table_1.id = table_2.an_id
INNER JOIN table_3
ON table_2.id = table_3.another_id
INNER JOIN table_4
ON table_3.id = table_4.tet_another_id
WHERE
table_4.id = 123
Даже если это произойдет, все равно стоит сравнить два варианта, чтобы увидеть, какой из них на самом деле быстрее.
Комментарии:
1. Объединения (внутренние, левые или правые) НАМНОГО эффективнее, чем подвыборки, для КАЖДОЙ ситуации, с которой я сталкивался, при работе с ~ миллиардом таблиц записей.
2. @J Jorgenson: Согласен, я также никогда не видел, чтобы было верно обратное. Но все равно полезно проверять и иметь некоторые определенные показатели. Такая проверка также помогает определить работоспособные индексы. И, кроме того, порядок величины записей имеет огромное значение. Как вы говорите, в таблицах с 10 ^ 9 записями объединение является явным победителем. Если в таблице никогда не будет больше 10 ^ 2 или 10 ^ 3, разница может быть не столь заметной. В этом случае могут возникнуть соображения по поводу ясности кода, а не производительности. (Не в этом случае, но, возможно, в похожих случаях.)
Ответ №3:
Попробуйте это:
SELECT
t1.*
FROM
table_1 AS t1
JOIN
table_2 AS t2 ON (t1.id = t2.id)
JOIN
table_3 AS t3 ON (t2.id = t3.id)
JOIN
table_4 AS t4 ON (t3.id = t4.id)
WHERE
t4.id = 123
Возможно, это поможет вам..