2013-03-28 4 views
1

У меня есть 2 стола: Users и Cars. Таблицы объединены в третьей таблице: Users_Cars_Join.Выбор данных из двух соединенных таблиц

Есть ли быстрый (прямой) метод для выбора данных из обеих таблиц (Cars, Users) без использования 'inner join' заявление присоединиться Users с Users_Cars_Join и чем использование этого еще раз, чтобы присоединиться к Users_Cars_joinCars?

Интересно, как это должно быть сделано правильно и профессионально.

Автомобили:

  • Id
  • Имя

Пользователи:

  • Id
  • Имя

Users_Cars_Join:

  • Id
  • UserId
  • CarId
+0

Я получаю эту структуру таблицы, и я не могу ее изменить. – Ellbar

+2

Какова связь между автомобилями и пользователями? – Sachin

+2

Если вы не можете изменить структуру таблицы, я думаю, вам всегда придется использовать соединения в таблице Users_car_join. Нет другого элемента, который бы разъяснял связь между пользователями и автомобилями. – benst

ответ

2

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

CREATE VIEW UsersCars AS 
SELECT c.ID AS CarID 
     , c.Name AS CarName 
     , u.ID AS UserID 
     , u.Name AS UserName 
FROM Cars c 
     INNER JOIN Users_Cars_Join ucj ON ucj.CarID = c.ID 
     INNER JOIN Users u ON u.ID = ucj.UserID 

Используя представление будет, как просто как

SELECT * FROM UsersCars 

Смотрите эту SQL Fiddle для демо

+0

Мне нужно изучить sth о просмотрах. Спасибо – Ellbar

+0

@Ellbar - По сути, это не что иное, как ярлык, который помешает вам написать полное заявление. При использовании представления при выборе, механизм фактически заменяет имя полным базовым выражением. Не переусердствуйте с использованием просмотров. Нетрудно сделать что-то из того, что вы делаете * (читай как, он может упростить вещи, когда используется разумно, но когда все становится видом, вы потеряете обзор, и проблемы с производительностью могут закрашиваться) * –

1

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

SELECT c.id, c.name, u.id, u.name, ... 
    FROM cars c, users u, user_cars_join uc 
WHERE u.id = uc.userid 
    AND c.id = uc.carid 

Things отметить:

  1. Стол существует, потому что он обозначает отношения «многие-ко-многим» между пользователями и их автомобилями. Если вы удалите эту таблицу из структуры, то таблицы users и cars больше не связаны.

  2. Вам необходимо понять явления отношений «один к одному», «один ко многим» и «многие ко многим».

    • Отношения «один к одному» - это один объект в одном наборе, относящийся только к одному объекту в другом наборе. В вашем случае это был бы один пользователь, владеющий только одним единственным автомобилем, который не практичен. Один человек может владеть несколькими автомобилями.

    • Отношение «один ко многим» относится к одному объекту в одном наборе, относящемуся к нескольким объектам в другом наборе, и одно сущность в другом множестве относится только к одному объекту в первом наборе. В вашем случае это был бы один пользователь, владеющий несколькими автомобилями, но один автомобиль принадлежит одному пользователю. Вы можете иметь такие отношения, особенно когда автомобиль имеет регистрационный номер. Схема будет выглядеть следующим образом:

      User (userid, name) 
      car_sales (carid, userid, registration_number) 
      Car (carid, name, brand, model) 
      

      Обратите внимание, что userid в car_sales таблице обозначает, какой пользователь владеет этим автомобилем.Кроме того, таблица carid в таблице car_sales относится к уникальной таблице carid в таблице car.

      Также обратите внимание, что в этой модели один пользователь может владеть несколькими автомобилями. Одна модель автомобиля может иметь несколько экземпляров (предметов), которые продаются нескольким пользователям.

      Это наиболее широко используемая и приемлемая модель для представления этих отношений.

    • Отношения «многие ко многим», реализованные в вашем примере, это когда несколько объектов в одном наборе связаны с несколькими объектами в другом наборе и наоборот. Для обозначения отношений между объектами должна быть отдельная таблица отношений, которая в вашем случае представляет собой таблицу user_car_join.