我有2张桌子:
Users
和Cars
。这些表连接在第三个表中:Users_Cars_Join
。
是否存在快速(直接)方法从两个表(Cars
,Users
)中选择数据而不使用'inner join'
语句将Users
加入Users_Cars_Join
并且再使用这一次加入Users_Cars_join
到Cars
?
我想知道应该如何正确和专业地完成它。
汽车:
用户:
Users_Cars_Join:
答案 0 :(得分:2)
没有办法绕过链接表,但如果你一直害怕写连接,你可以创建一个只做那个的连接
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了解演示
答案 1 :(得分:1)
你可以使用旧的stye连接这样的表:
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
注意事项:
user_cars_join
表存在,因为它表示用户与其汽车之间的多对多关系。如果从结构中删除此表,则users
和cars
表将不再相关。
您需要了解一对一,一对多和多对多关系的现象。
一对一关系是一组中的一个实体仅与另一组中的一个实体相关。在你的情况下,一个用户只拥有一辆单车,这是不实际的。一个人可以拥有多辆汽车。
一对多关系是一组中的一个实体与另一组中的多个实体相关,而另一组中的一个实体仅与第一组中的一个实体相关。在你的情况下,一个用户拥有多辆汽车,但一辆汽车由一个用户拥有。你可以有这种关系,特别是当汽车有注册号码时。架构看起来像这样:
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
表。