2014-02-28 69 views
0

我有这个疑问:更新查询中使用连接表

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

它需要进行更新,以包括第三表,该表包含驱动程序和卡ID的来自各个表连接表。表1称为card。是重要的领域是:

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

是重要的领域是: ID - 表 associated_card的自动递增值 - 有一个值,通常一些数量e.g 123555 //实际上并不是表的一部分。

创建由第三台 referred_as - 驱动程序的名称()卡表称为associated_driver

忘了加入这个表:

表3被称为card_driver。这是很重要的领域是:

driver_id - 从连接到卡 card_id驱动器表中的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

+0

如果你分享你的表格模式,这将很容易理解 – sunk

+0

你的意思是来自sql文件的东西吗? – Lazis002

+0

看看这个问题是否有帮助:http://stackoverflow.com/questions/8057565/mysql-update-statement-inner-join-tables – Maximus2012

回答

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 *;你明确选择从查询返回的列需要更好。

+0

我将添加卡片和驱动器表格的一些屏幕截图,以便您更好地理解引用的列。查询剂量也起作用。错误 - #1066 - 不是唯一的表/别名:'驱动程序' – Lazis002

+0

哎呀,抱歉在我的查询错字。 –