2014-12-05 3 views
0

Вот один из примеров, у меня есть таблицы автомобилей, пользователей, пользователей и дилеров. На данный момент я пытаюсь получить имя дилера, которому принадлежит автомобиль, сопоставляя их UserIds доЛучший запрос MySQL?

Select userid, name FROM `User` WHERE userid IN 
    (SELECT userid FROM 'Car' WHERE userid in 
     (SELECT userid FROM `Member` WHERE userid IN 
      (SELECT userid FROM `Dealer`))) 

Это то, что я хочу, но я не могу помочь чувствовать, что есть лучший способ сделать это? В настоящее время userid в Car является FK идентификатора пользователя в Dealer, который является FK идентификатора пользователя в Member, который является FK идентификатора пользователя в User, который хранит имя.

Могу ли я перейти к получению всех идентификаторов пользователей и имен дилеров, которые являются идентификаторами, находящимися на Столе автомобилей, в то же время убедившись, что они на самом деле являются дилером?

ответ

1

Использовать JOIN вместо подзапросов для извлечения данных.

Попробуйте это:

SELECT U.userid, U.NAME 
FROM `User` U 
INNER JOIN Car C ON U.userid = C.userid 
INNER JOIN Member M ON C.userid = M.userid 
INNER JOIN Dealer D ON M.userid = D.userid; 
+0

Все, спасибо! – p3tch

1

В основном ваша схема является нижестоящей схемы

Пользователи -> Пользователи -> Dealer -> Автомобиль

Хорошая вещь вы сделали все возможные ключи, которые вы необходимо здесь.

Так SELCT ничего в любой таблице просто идти вниз по течению от пользователей, например, для данных, которые вы хотите

Select * from `USER` u  
    where 
    dealer.user_id = car.user_id and 
    member.user_id = dealer.user_id and 
    u.user_id = member.user_id 

Причина я пошел вверх по течению соответствующих записей, потому что мы хотим сделать, как несколько одинаковых операций, как возможное. Как видите, таблица user должна содержать максимальные записи. Поэтому я соглашусь с таблицей car и получаю все user_id, где есть матч в dealer. Аналогично, я иду от dealer до member, а затем до user. это означает, что все записи пользователей будут сопоставляться с намного меньшим количеством записей, которые были бы у меня, если бы я перешел от users к members в dealer в car.

Но это не доказательство дурака. это будет зависеть от ваших данных. потому что это может быть случай, когда один пользователь может иметь несколько автомобилей, тогда было бы лучше пойти вниз по течению.

Смежные вопросы