对不在两个表中的列进行联接的行为是什么?
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
cart
和 products
是内连接的。
继续进行下一个连接的虚拟 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
。
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
cart
和 products
是内连接的。
继续进行下一个连接的虚拟 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
。