2014-01-07 47 views
0

我有2个表订单和客户数据为:内/外连接问题在MySQL

mysql> select * from orders; 
+---------+----------------+----------+-------+ 
| orderid | product  | customer | price | 
+---------+----------------+----------+-------+ 
|  292 | sofa   |  101 | 6000 | 
|  293 | table   |  105 | 3000 | 
|  294 | table   |  104 | 1450 | 
|  295 | table   |  101 | 1200 | 
|  296 | chair   |  103 | 800 | 
|  297 | dressing table |  104 | 9000 | 
|  298 | corner   |  102 | 1000 | 
|  299 | corner   |  102 | 900 | 
|  300 | bed   |  NULL | NULL | 
|  301 | door   |  NULL | NULL | 
+---------+----------------+----------+-------+ 
10 rows in set (0.00 sec) 


mysql> select * from customers; 
+--------+----------+-----------+ 
| custid | name  | location | 
+--------+----------+-----------+ 
| 101 | jaspreet | New delhi | 
| 102 | harpreet | Jalandhr | 
| 103 | surjit | Amritsar | 
| 104 | harneet | ludhiana | 
| 105 | hashar | New Delhi | 
| 106 | harneet | NULL  | 
+--------+----------+-----------+ 
6 rows in set (0.00 sec) 

当我运行内部联接,它返回以下数据:

mysql> select orders.orderid,customers.name from orders inner join customers where orders.customer=customers.custid; 
+---------+----------+ 
| orderid | name  | 
+---------+----------+ 
|  292 | jaspreet | 
|  295 | jaspreet | 
|  298 | harpreet | 
|  299 | harpreet | 
|  296 | surjit | 
|  294 | harneet | 
|  297 | harneet | 
|  293 | hashar | 
+---------+----------+ 
8 rows in set (0.00 sec) 

但外连接不在这方面工作。

mysql> select orders.orderid,customers.name from orders left join customers where orders.customer=customers.custid; 

ERROR 1064(42000):你在你的SQL语法错误;检查对应于你的MySQL服务器版本正确的语法 使用正耳朵“其中orders.customer = customers.custid”在行1

有人可以帮我这个概念 手册?

在此先感谢

+0

明确使用'加入'关键字需要'关于'关键字来代替'哪里' – Rugal

回答

3

JOIN条件与ON指定,而不是WHERE

SELECT orders.orderid, 
     customers.name 
FROM orders 
     LEFT JOIN customers 
       ON orders.customer = customers.custid; 

你应该使用这个与内部和外部连接。 WHERE应该用于单个表格的条件,而不是连接条件。

因为没有ON子句的连接会执行完整的交叉产品,所以在内部联接中没有此功能,然后WHERE子句基于跨此测试进行过滤。我不知道为什么,但是你不能用外连接来做到这一点。

+0

感谢您的解决方案。唯一的问题是尝试在内部联接中的哪个位置。你的澄清解决了这个疑问,以及内部如何实现“何处”。我实际执行内部连接选择orders.orderid,customers.name从订单内部连接客户;没有任何地方条款,它确实给了我一个完整的交叉产品。谢谢 – jazz199

4

您正在寻找ON没有WHERE

SELECT orders.orderid, 
     customers.name 
FROM orders 
     LEFT JOIN customers 
       ON orders.customer = customers.custid;