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
答案 0 :(得分:1)
cart
和products
是内部联接的。
转到下一个加入的虚拟表包括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.id
,cart.user_id
,cart.product_id
然后,使用来自虚拟桌的product_images
和product_images
列,将此虚拟表连接到cart.product_id
。