Mysql多对多表查询

Mysql多对多表查询,mysql,sql,Mysql,Sql,我有三张桌子,汽车,司机,汽车和司机 我的cars表有两个字段-carid和car\u model “我的驱动程序”表有两个字段-driverid和driver\u name 我的cars\u drivers有两个字段,分别是主键carid和driverid 我的cars表中有3个条目 丰田 本田 起亚 而我的司机表 鲍勃 汤姆 我的汽车司机表是什么样的?我会在carId中输入3或更少的数字,在DriverId中输入2或更少的数字吗 1-1 1-2 1-3 我将如何进行查询以显示3个随机驾驶员

我有三张桌子,汽车,司机,汽车和司机

我的cars表有两个字段-carid和car\u model

“我的驱动程序”表有两个字段-driverid和driver\u name

我的cars\u drivers有两个字段,分别是主键carid和driverid

我的cars表中有3个条目

  • 丰田
  • 本田
  • 起亚
  • 而我的司机表

  • 鲍勃
  • 汤姆
  • 我的汽车司机表是什么样的?我会在carId中输入3或更少的数字,在DriverId中输入2或更少的数字吗

    1-1
    1-2
    1-3
    
    我将如何进行查询以显示3个随机驾驶员的车型

    我在找像这样的东西

    toyota  bob
    kia     tom
    honda   bob
    

    我已经阅读了一些教程,但我也不了解联接是如何工作的。请说您的表是这样的:

    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表基本上是将驾驶员与他们驾驶的汽车联系起来;i、 e.表中的第一行表示id为1的驾驶员驾驶id为9的汽车。

    连接相关信息。进入car_driver(汽车驾驶员)系统会告诉您汽车是由驾驶员驾驶的。如果你只是想显示一个随机的驱动程序,你根本不需要一个连接,只需要获取所有的驱动程序并从列表中随机选择一个

    然而,数据库通常与信息相关。例如,一个拥有他们曾经的工作的人。你不能只是把一份随机的工作放在某人的旁边,你要用一个连接来获得正确的关系

    差不多

      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 ' 
    

    您的模式应确保
    cars\u drivers
    表中有两列(字段),它们共同构成一个复合主键,分别是
    cars
    drivers
    表的外键

    cars\u drivers
    表记录了每个驾驶员“可以”或“做”或“想要”驾驶的汽车

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

    您可以从以下三个表中进行选择:

    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\u 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;
    

    您的cars\u drivers表存储关于哪些车辆由哪些驾驶员驾驶的信息。如果鲍勃驾驶起亚,你会把(3,1)装进汽车里。联接通常不用于随机数据,但更多用于显示数据之间的关系确实很容易理解+1.
    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;