更新查询以使用连接表

时间:2014-02-28 16:36:24

标签: php mysql sql

我有这个问题:

 $sql ="SELECT * FROM card c JOIN driver d ON c.referred_as=d.referred_as WHERE d.ID='$id'";

需要更新它以包含第3个表,这是一个包含来自各自表的驱动程序和卡ID的连接表。

表1称为card。重要的字段是:

state_id - 此表有3个值(1,2,3)    associated_driver - 在referred_as表上调用driver //实际上不是表的一部分。由第3个表创建     referred_as - 在associated_card表上调用了driver 表2称为driver

重要的字段是: ID - 表的自动递增值 associated_card - 有一个值,通常是一些数字,例如123555 //实际上并不是表格的一部分。

由第3张表创建 referred_as - 卡表上名为associated_driver的驱动程序()的名称

忘记添加此表:

表3称为card_driver。重要的字段是:

driver_id - 链接到卡的驱动程序表中的id card_id - 卡表中链接到驱动程序的ID

我想要发生什么:

当用户从driver表中输入其ID时,它将比较两个表所具有的字段,即associated_card字段(在卡表上称为referred_as)。

associated_card来自联接表,我不知道如何进入查询。

欢迎任何帮助。如果你需要我解释一下,我会。

--
-- Table structure for table `card`
--

CREATE TABLE IF NOT EXISTS `card` (
  `id` int(11) NOT NULL auto_increment,
  `startdate` date NOT NULL,
  `enddate` date NOT NULL,
  `state_id` int(11) NOT NULL,
  `referred_as` varchar(40) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;


--
-- Table structure for table `card_driver`
--

CREATE TABLE IF NOT EXISTS `card_driver` (
  `card_id` int(11) NOT NULL,
  `driver_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


--
-- Table structure for table `driver`
--

CREATE TABLE IF NOT EXISTS `driver` (
  `id` int(11) NOT NULL auto_increment,
  `title` varchar(40) default NULL,
  `supplier_id` int(11) NOT NULL,
  `referred_as` varchar(40) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ;

一些图片:

This is the driver table This is the card table

1 个答案:

答案 0 :(得分:0)

您的card_driver表似乎在card表和driver表中的行之间实现了多对多关系。像这样的表通常称为连接表

这样的连接表显示了两个所谓的详细信息表之间的关系,在本例中为carddriver

对不起,当您在两个详细信息表格中描述referred_as列时,我不明白您的意思。

我认为您要求的是与特定card相关的所有driver项。你可以得到这样的结果:

SELECT card.id, card. startdate, card.enddate, card.state_id, card.referred_as,
       driver.id AS driverid, driver.title, driver.supplier_id, 
       driver.referred_as
  FROM driver
  LEFT JOIN card_driver ON card.id = card_driver.driver_id
  LEFT JOIN card        ON card_driver.card_id = card.id
 WHERE driver.id = '$id'

这将通过card_driver表中的多对多关系为每个卡分配给该驱动程序一行。每行将包含有关驱动程序和卡的信息。

正如您所看到的那样,它可以通过加入连接表,然后加入其他详细信息表来实现。

专业提示:请勿在生产软件中使用SELECT *;你最好选择明确从查询中返回的列。