【发布时间】:2015-02-28 07:10:00
【问题描述】:
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,遍历用户的购物车并返回products表中所有对应的行,并且该产品恰好有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
【问题讨论】:
-
您是否想要所有只有 1 张图片且在购物车中的产品?
标签: mysql join group-by left-join