Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 对不在两个表中的列进行连接的行为是什么?_Mysql_Join_Group By_Left Join - Fatal编程技术网

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

Mysql 对不在两个表中的列进行连接的行为是什么?,mysql,join,group-by,left-join,Mysql,Join,Group By,Left Join,底部两个表中的产品标识对应于产品表中的标识。 购物车表中的用户id对应于用户表中的id 我的朋友和我正在开发一个通用的购物网站只是为了好玩 要求:给定一个用户id,遍历用户的购物车,返回products表中的所有对应行,并且该产品只有一个图像(可能有多个图像) 这是我们的问题(似乎有效): 第一个联接对我来说很直观,因为联接中涉及的两个表都在每个表中的列上联接 这是我感到困惑的第二个连接。 我的理解是,第一次连接将生成一个虚拟表。 然后将该虚拟表与product_images表联接,但令人困惑的

底部两个表中的产品标识对应于产品表中的标识。 购物车表中的用户id对应于用户表中的id

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

要求:给定一个用户id,遍历用户的购物车,返回products表中的所有对应行,并且该产品只有一个图像(可能有多个图像)

这是我们的问题(似乎有效):

第一个联接对我来说很直观,因为联接中涉及的两个表都在每个表中的列上联接

这是我感到困惑的第二个连接。
我的理解是,第一次连接将生成一个虚拟表。 然后将该虚拟表与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;