MySQL有多个内连接?

时间:2015-03-24 04:15:10

标签: mysql

我有三张桌子......

create table customers (
customerID integer unsigned not null auto_increment,
customername varchar(45) not null,
address varchar(45) not null,
city varchar(45) not null,
state varchar(2) not null,
zip mediumint(5) zerofill not null,
primary key (customerID)
);

create table products (
prodID integer unsigned not null auto_increment,
prodname varchar(45) not null,
prodcat integer unsigned,
proddesc varchar(75) not null,
price float (8,2),
qoh integer not null,
prodiconurl varchar(45),
primary key (prodID),
constraint FK_CAT foreign key FK_CAT (prodcat)
    references categories (catID)
    on delete restrict
    on update restrict
);

create table SHOPPING_CART (
CustomerID INTEGER UNSIGNED NOT NULL,
ProductID INTEGER UNSIGNED NOT NULL,
ProdQnty INTEGER UNSIGNED NOT NULL,
Primary Key (CustomerID, ProductID),
CONSTRAINT Fk_Cust Foreign Key Fk_Cust (CustomerID)
    References Customers (CustID)
    On Delete restrict
    On Update restrict, 
CONSTRAINT Fk_Prod Foreign Key Fk_Prod (ProductID)
    References Products (ProdID)
    On Delete restrict
    On Update restrict
);

表格很好。我遇到问题的是我对SHOPPING_CART的SELECT语句。如果我插入以下代码。

insert into SHOPPING_CART
Values (
1, 4, 2
);
insert into SHOPPING_CART
values (
1, 9, 1
);

我的内部联接不适用于查找CustID,从Customers表返回FirstName和LastName字段,并根据购物车表中的值从Products表返回产品名称。

这是我的最终目标。

SELECT 
Customers.FirstName,
Customers.LastName,
Products.Name,
SHOPPING_CART.ProdQnty
FROM SHOPPING_CART
inner join Customers on SHOPPING_CART.CustomerID = Customers.CustID
where Customers.CustID = SHOPPING_CART.CustomerID
inner join Products on SHOPPING_CART.ProductID = Products.ProdID
where Products.ProdID = SHOPPING_CART.ProductID;

当第二个内连接是语句的一部分时,我得到一个语句错误,该语句在第二个内连接上有一个红色的x。

2 个答案:

答案 0 :(得分:2)

只需要1个where语句。第二个where语句将在“AND”语句下面。注意:代码是ANSI-92之前的版本。有关如何使用ANSI-92的说明遵循代码示例。

SELECT 
Customers.FirstName,
Customers.LastName,
Products.Name,
SHOPPING_CART.ProdQnty
FROM SHOPPING_CART
WHERE Customers.CustID = SHOPPING_CART.CustomerID
AND Products.ProdID = SHOPPING_CART.ProductID;

<强>历史:

在ANSI 92之前,where语句中的连接很常见。标准化之后,连接从where语句移动到from语句。 where语句用于提供额外的过滤能力,例如status ='open'。以下摘录解释了ANSI-92连接语法。

  

ANSI连接语法在ANSI SQL-92标准出台之前   新的连接语法,关系(表,视图等)在中被命名   FROM子句,以逗号分隔。加入条件在中指定   WHERE子句:

     

=&GT; SELECT * FROM T1,T2 WHERE T1.id = T2.id; ANSI SQL-92标准提供了更具体的连接语法,其中的连接条件在   ON子句:

     

=&GT; SELECT * FROM T1 [INNER | LEFT OUTER |右外| FULL OUTER |天然| CROSS] JOIN T2 ON T1.id = T2.id参见SQL-99 ANSI   有关其他详细信息,请参阅BNF Grammar for SQL-99的语法。

     

<强>优点:

     

SQL-92外连接语法可跨数据库移植;年纪大了   语法在数据库之间不一致。 SQL-92语法提供了更好的控制   谓词将在外连接期间或之后进行评估。这是   使用旧语法时,数据库之间也不一致。看到   “加入条件与过滤条件”如下。 SQL-92语法   在一些情况下,按照评估连接的顺序消除歧义   其中两个以上的表与外连接连接在一起。联盟加入   可以使用SQL-92语法表示,但不能用较旧的语法表示。

包含ANSI-92的更新查询:

SELECT 
Customers.FirstName,
Customers.LastName,
Products.Name,
SHOPPING_CART.ProdQnty
FROM SHOPPING_CART
inner join Customers on SHOPPING_CART.CustomerID = Customers.CustID
inner join Products on SHOPPING_CART.ProductID = Products.ProdID

答案 1 :(得分:2)

如果您使用JOIN,那么您不需要在哪里。

您的请求将是

SELECT 
  Customers.FirstName,
  Customers.LastName,
  Products.Name,
  SHOPPING_CART.ProdQnty
FROM SHOPPING_CART
INNER JOIN Customers ON SHOPPING_CART.CustomerID = Customers.CustomerID
INNER JOIN Products on SHOPPING_CART.ProductID = Products.ProdID

我在代码中的on子句中发现了一个错误。您对表Customers使用了CustID。但是在您的create table中,这个字段是CustomerID。不知道哪里出错了 - 只是写了你的结构请求。