2015-07-16 2 views
1

Недавно в одном из интервью, у меня было следующая проблема:Наиболее эффективный MySQL (интервью Query)

У меня есть база данных со следующими таблицами (для этого примера, давайте предположим, что эти таблицы имеют смысл) :

  • пользователя (идентификатор, имя, cc_id)
  • CreditCard (идентификатор)
  • Movie (номер, имя)
  • Покупка (movie_id, cc_id)

Я хочу найти имена клиентов, которые купили фильм «Темный рыцарь».

Мой ответ, когда по линии:

SELECT name FROM User AS u 
    INNER JOIN CreditCard AS cc ON u.id = cc.id 
    INNER JOIN Purchase AS p ON p.movie_id = 
     (SELECT id FROM Movie AS m WHERE m.name = "Dark Knight") AND cc.id = p.cc_id 

Синтаксис в сторону, мне было интересно, если это более эффективное решение этой проблемы.

+0

Wth ... почему у них пользователя есть cc_id, а не куб.см имеют u_id ? странно. – Neal

+0

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

ответ

3

Было бы лучше просто присоединиться к movie таблицу тоже, и не присоединиться к creditcard

SELECT u.name 
FROM `User` AS u 
INNER JOIN Purchase AS p ON p.cc_id = u.cc_id 
INNER JOIN movie m on p.movie_id = m.id 
WHERE m.name = 'Dark Knight' 
+0

Итак, в этом случае JOIN будет более эффективным, чем SELECT? –

+2

Да. Внутренние выборки медленные. – Neal

+1

Обычно соединение лучше, чем подзапрос. –

1
SELECT name from User as u 
    JOIN CreditCards as cc on cc.id = u.cc_id 
    JOIN Purchase AS p ON p.cc_id = c.id 
    JOIN Movie AS m on m.id = p.movie_id 
WHERE m.name = 'Dark Night';