不在两个表中的列上的连接行为是什么?

时间:2015-01-01 19:28:25

标签: mysql join group-by left-join

table: users
columns: id

table: products
columns: id

table: product_images
columns: product_id |  path

table: cart
columns: user_id | product_id 
底部2个表中的

product_id对应于products表中的id。 cart表中的user_id对应于users表中的id。

我和我的朋友正在开发一个通用购物网站,只是为了好玩。

要求:给定user_id,浏览用户的购物车并返回产品表中的所有相应行,并且产品只有1个图像(可能有多个图像)。

这是我们的查询(似乎有效):

SELECT products.*, product_images.path
FROM products
INNER JOIN cart 
ON cart.product_id = products.id AND cart.user_id = 13  /* arbitrary id */
LEFT OUTER JOIN product_images 
ON product_images.product_id = cart.product_id
GROUP BY cart.product_id

第一个连接对我来说很直观,因为连接中涉及的两个表都连接到每个表中的列。

这是我很困惑的第二次加入。
我的理解是第一次连接将产生一个虚拟表。 然后,此虚拟表与product_images表连接,但令人困惑的部分是ON条件未使用直接属于虚拟表的列。

那究竟是怎么回事?

请注意,我知道如何以对我更直观的方式重写查询,并且理解对我来说很重要的概念。

起初我认为这种情况并不常见,但我注意到w3schools在此链接的底部做同样的事情:http://www.w3schools.com/sql/sql_groupby.asp

1 个答案:

答案 0 :(得分:1)

cartproducts是内部联接的。

转到下一个加入的虚拟表包括cart中的所有列以及products 中的所有列。

此虚拟/逻辑表格如下所示。

SELECT products.id,
       cart.user_id,
       cart.product_id
FROM   products
       INNER JOIN cart
         ON cart.product_id = products.id
            AND cart.user_id = 13;

因此,此虚拟表中有三列。 products.idcart.user_idcart.product_id

然后,使用来自虚拟桌的product_imagesproduct_images列,将此虚拟表连接到cart.product_id