在MySQL中创建的VIEW使用SELECT提供错误的输出

时间:2016-03-02 18:46:30

标签: mysql database database-design

我为一家朝臣公司创建了一个数据库,我有5个关系

for(j = 0; j < i; j++)

我正在尝试为客户创建一个VIEW,以便访问特定列,这是查询

CREATE TABLE Customer
(
cid int(7) NOT NULL,
cfname char(25) NOT NULL, 
clname char(25) NOT NULL, 
aptnum int(100) NOT NULL,
street char(50) NOT NULL, 
pobox int(10) NOT NULL,
area char(50) NOT NULL, 
country char(50) NOT NULL, 
phone int(12) NOT NULL,
PRIMARY KEY (cid)
)ENGINE=INNODB;

CREATE TABLE Orderr
(
orderid int(8) NOT NULL, 
origin char(100) NOT NULL, 
destination char(100) NOT NULL, 
eta date NOT NULL, 
weight int(100) NOT NULL,
priority enum('F','R') NOT NULL,
task enum('P','D') NOT NULL, 
odate date NOT NULL, 
cnum int(12) NOT NULL, 
cpin int(8) NOT NULL,
custid int(7) NOT NULL,
PRIMARY KEY (orderid),
FOREIGN KEY (custid) REFERENCES Customer(cid)
)ENGINE=INNODB;


CREATE TABLE History 
(
histid int(6) NOT NULL, 
orderid int(8) NOT NULL, 
status enum('D','O','R') NOT NULL, 
current_loc char(50) NOT NULL,
PRIMARY KEY(histid), 
FOREIGN KEY (orderid) REFERENCES Orderr(orderid)
)ENGINE=INNODB;

CREATE TABLE Driver
(
driverid int(6) NOT NULL,
dfname varchar(25) NOT NULL,
dlname varchar(25) NOT NULL,
dob date NOT NULL,
phone int(10) NOT NULL,
vehicle int(6) NOT NULL,
PRIMARY KEY (driverid)
)ENGINE=INNODB;

CREATE TABLE Vehicle
(
vid int(6) NOT NULL, 
num_plate varchar(6) NOT NULL, 
vtype enum('T','B','P') NOT NULL,
driverr int(6) NOT NULL,
orders int(8) NOT NULL,
PRIMARY KEY (vid),
FOREIGN KEY (driverr) REFERENCES Driver(driverid),
FOREIGN KEY (orders) REFERENCES Orderr(orderid)
)ENGINE=INNODB;

当我运行CREATE VIEW CustView AS SELECT cfname, clname, aptnum, street, pobox, area, country, origin, destination, weight, priority, task, eta, odate, dfname, dlname, driver.phone FROM Customer, Orderr, Vehicle, Driver WHERE Customer.cid=Orderr.custid AND Vehicle.driverr=Driver.driverid AND Orderr.orderid=Vehicle.orders; 时,我没有得到所需的输出。我应该对我的查询或者对我的关系做出什么改变?

感谢。

1 个答案:

答案 0 :(得分:0)

正如之前的海报所说,我只能猜测。但是从你的表和视图定义中,我怀疑你没有正确地模拟Vehicle和Order之间的关系。车辆可以用于许多订单,对吧?在这种情况下,Vehicle id必须是Order表中的外键。你的设计恰恰相反。

与您的问题无关,我怀疑您的历史记录表。订单履行的历史只​​包括过去的那些订单,对吧?因此,历史记录只是一个视图,通过其中包含的某些日期的过去值来选择订单。