对不在两个表中的列进行联接的行为是什么?

What is the behaviour of a join on columns not in both tables?

table: users
columns: id

table: products
columns: id

table: product_images
columns: product_id |  path

table: cart
columns: user_id | product_id 

product_id在最下面的2table对应产品中的idtable。 购物车table中的user_id对应用户table中的id。

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

要求:给定 user_id,遍历用户的购物车和 return 产品中的所有对应行 table 并且只有 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

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

这是我困惑的第 2 个连接。
我的理解是第一个连接会产生一个虚拟 table。 这个虚拟 table 然后与 product_images table 连接,但令人困惑的部分是 ON 条件不使用直接属于虚拟 table 的列。

那么这里到底发生了什么?

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

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

cartproducts 是内连接的。

继续进行下一个连接的虚拟 table 包括来自 cart 的所有列和来自 products.[=21 的所有列=]

这个virtual/logicaltable会变成下面这样

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;

因此在这个虚拟 table 中有三列。 products.id,cart.user_id,cart.product_id

这个虚拟 table 然后使用来自 product_images 的列和来自虚拟 table 的 cart.product_id 左连接到 product_images