Как я мог бы привести в порядок этот код MySQL и сделать его более читабельным?

#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
  

Возможно, это поможет вам..