Mysql 对不在两个表中的列进行连接的行为是什么?
底部两个表中的产品标识对应于产品表中的标识。 购物车表中的用户id对应于用户表中的id 我的朋友和我正在开发一个通用的购物网站只是为了好玩 要求:给定一个用户id,遍历用户的购物车,返回products表中的所有对应行,并且该产品只有一个图像(可能有多个图像) 这是我们的问题(似乎有效): 第一个联接对我来说很直观,因为联接中涉及的两个表都在每个表中的列上联接 这是我感到困惑的第二个连接。Mysql 对不在两个表中的列进行连接的行为是什么?,mysql,join,group-by,left-join,Mysql,Join,Group By,Left Join,底部两个表中的产品标识对应于产品表中的标识。 购物车表中的用户id对应于用户表中的id 我的朋友和我正在开发一个通用的购物网站只是为了好玩 要求:给定一个用户id,遍历用户的购物车,返回products表中的所有对应行,并且该产品只有一个图像(可能有多个图像) 这是我们的问题(似乎有效): 第一个联接对我来说很直观,因为联接中涉及的两个表都在每个表中的列上联接 这是我感到困惑的第二个连接。 我的理解是,第一次连接将生成一个虚拟表。 然后将该虚拟表与product_images表联接,但令人困惑的
我的理解是,第一次连接将生成一个虚拟表。 然后将该虚拟表与product_images表联接,但令人困惑的是ON条件没有使用直接属于该虚拟表的列 那么这里到底发生了什么 请注意,我知道如何以一种对我来说更直观的方式重写查询,理解这个概念对我来说很重要
起初我认为这很少见,但我注意到w3schools在这个链接的底部做了同样的事情:
购物车和产品是内部连接的
进入下一个联接的虚拟表包括购物车中的所有列和产品中的所有列
该虚拟/逻辑表如下所示
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
所以这个虚拟表中有三列<代码>产品.id
,购物车.user\u id
,购物车.product\u id
然后,使用虚拟表中的product\u images
和cart.product\u id
中的列,将此虚拟表左连接到product\u images
上。是否希望所有正好有一个图像且在carts中的产品?@KacyRaye-该连接中涉及的左表是products*carts
,以便将产品和购物车中的所有列纳入范围。所涉及的右表是product\u images
,以便将product\u images
中的列引入范围。因此,左连接谓词可以引用这三个表中的任何一个表中的列。@KacyRaye和您的问题是“令人困惑的是ON条件没有使用直接属于虚拟表的列。”因此,行在这里根本不相关。如果您对结果感到困惑,请参阅。对左外部联接的解释完全相同,只是左边的表不是基表,而是我的答案中查询的结果。@KacyRaye-是的,它使用虚拟表中的product_id列(当然是从cart
中派生出来的)@KacyRaye-我想我的答案在这一点上应该更清楚。希望是现在@KacyRaye-逻辑上,GROUPBY
发生在连接和where子句(如果存在)之后。因此,它将使用第二次连接产生的虚拟表中的cart.product\u id
列。SELECT
逻辑上几乎最后运行。之后发生的唯一步骤是按
排序和限制
。
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
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;