2

我有 3 桌汽车、司机、汽车司机。

我的汽车表有两个字段 - carid 和 car_model

我的驱动程序表有两个字段 - driverid 和 driver_name

我的 cars_drivers 有两个字段,它们是主键 - carid 和 driverid。

我的汽车表中有 3 个条目

  1. 丰田
  2. 本田
  3. 起亚

我的司机表有

  1. 鲍勃
  2. 汤姆

我的 car_drivers 表会是什么样的?我会在 carId 中输入 3 或更少的数字,在 DriverId 中输入 2 或更少的数字吗?

1-1
1-2
1-3

我将如何进行查询以显示 3 个带有随机驾驶员的车型?

我正在寻找类似的东西

toyota  bob
kia     tom
honda   bob

我一直在浏览一些教程,但我也没有关注连接的工作方式

4

3 回答 3

2

JOIN 关联信息。car_driver 中的一个条目告诉您汽车是由司机驾驶的。如果您只想显示一个随机驱动程序,则根本不需要加入,只需获取所有驱动程序并从列表中随机选择一个即可。

然而,通常数据库关联信息。例如,有工作的人。您不能只是将随机工作放在某人旁边,而是使用 JOIN 来获得正确的关系

就像是

  SELECT * FROM jobs
     LEFT JOIN people_jobs ON jobs.jobid = people_jobs.jobid 
     LEFT JOIN people ON people.personid = people_jobs.personid 
     WHERE person.personname = 'Bob Smith' 

会给你关于鲍勃所有工作的信息。

然而

  SELECT * FROM people 
     LEFT JOIN people_jobs ON people.personid = people_jobs.personid 
     LEFT JOIN jobs ON jobs.jobid = people_jobs.jobid 
     WHERE jobs.job = 'Waiter ' 

会让你得到数据库中所有曾经是服务员的人。

于 2012-10-20T01:07:14.040 回答
2

您的模式应该是这样的表有两列(字段),它们共同形成一个复合主键,并且分别是和表cars_drivers的外键。carsdrivers

cars_drivers表记录了每位驾驶员“可以”或“愿意”或“想要”驾驶的汽车。

对于给定的数据,carid列中的值应在 1-3 范围内;列中的值driverid应在 1-2 范围内。假设您使用 InnoDB 存储,这些约束应该自动强制执行(我保留对 MyISAM 的判断,但我认为它不会强制执行 PK-FK 约束)。

CREATE TABLE cars_drivers
(
    carid      INTEGER NOT NULL REFERENCES cars,
    driverid   INTEGER NOT NULL REFERENCES drivers,
    PRIMARY KEY(carid, driverid)
);  -- Plus storage options as required ...

您可以从三个表中选择:

SELECT c.*, d.*
  FROM cars AS c
  JOIN cars_drivers AS j ON c.carid = j.carid
  JOIN drivers AS d ON d.driverid = j.driverid;

您可以根据需要在联接上应用条件。请注意,显示此联接中的任何数据并没有特别的好处,cars_drivers因为这些值将与其他两个表中的值之一相同。

要仅获取模型名称和驱动程序名称,您只需指定这些列:

SELECT c.car_model, d.driver_name
  FROM cars AS c
  JOIN cars_drivers AS j ON c.carid = j.carid
  JOIN drivers AS d ON d.driverid = j.driverid;
于 2012-10-20T01:09:36.647 回答
1

假设您的表格如下所示:

Table 1: Drivers
    id      Name
    1       Joe Bloggs
    2       Si Borg
    3       Anne Droyd

Table 2: Cars
    id      Type
    9       Honda
    8       Toyota
    7       Kia


Table 3: CarDrivers
    CarId   DriverId
    9       1
    9       2
    8       2
    7       3

您的查询将是:

select d.name, c.type
from Drivers d
inner join CarDrivers cd
    on d.id = cd.DriverId
inner join Cars c
    on cd.CarId = c.id

给出结果:

Name        Type
Joe Bloggs  Honda
Si Borg     Honda
Si Borg     Toyota
Anne Droyd  Kia

CarDriver 表基本上是将司机与他们驾驶的汽车联系起来;即该表中的第一行表示 ID 为 1 的司机驾驶 ID 为 9 的汽车。

于 2012-10-20T01:07:03.247 回答