NodeJS+MySQL购物站点查询购物车商品并校验是否在收藏表的方法
购物车关联商品信息和收藏状态查询方案
原有SQL的核心问题
你写的现有SQL存在两个明显逻辑错误:
- 采用隐式内连接关联
saved表,只要用户未收藏某件购物车商品,该商品记录会被直接过滤,无法返回完整购物车列表 - 多表关联产生的笛卡尔积会导致
COUNT统计结果完全不符合预期,同时分组规则不符合MySQL严格模式要求,容易出现随机取值问题
正确查询语句
SELECT c.user_id, c.product_id, p.name AS product_name, p.price, p.description, p.vendor, p.tag, p.rating, p.image, p.amountInStock, COUNT(c.id) AS product_count, CASE WHEN s.product_id IS NOT NULL THEN 1 ELSE 0 END AS inSaved FROM cart c -- 内连接关联商品表,确保只返回商品库中存在的有效商品 INNER JOIN products p ON c.product_id = p.id -- 左连接关联收藏表,无收藏记录也不会过滤购物车商品 LEFT JOIN saved s ON s.user_id = c.user_id AND s.product_id = c.product_id WHERE c.user_id = '13' -- 分组规则符合MySQL严格模式要求,避免非分组字段取值异常 GROUP BY c.user_id, c.product_id, p.id
补充说明
如果后续你调整Cart表结构,新增quantity字段存储同一商品的加购数量(避免同个用户同个商品生成多条Cart记录),可以直接去掉GROUP BY语句,将COUNT(c.id) AS product_count替换为c.quantity AS product_count即可,查询性能会更高。
内容的提问来源于stack exchange,提问作者Oluwaferanmi Ajiboye
相关产品推荐
相关产品推荐

