【问题标题】:MYSQL Inner Join two table over two keysMYSQL 内部通过两个键连接两个表
【发布时间】:2011-01-28 13:26:14
【问题描述】:

我正在查询返回所有用户的购物车,存储在 sb_carts 表中。存储在 sb_carts 中的产品信息通过两个键 product_sku 和 school_id 进行引用。它需要参考两者以返回具有独特库存水平等的独特产品。

当我执行以下查询时,它返回一行,我期待 3 行。 我尝试将内部连接分成两个单独的连接,但这仍然只返回 1 个结果。只加入一个键可以获得预期的结果,但可能会重新调整错误的产品。左连接返回 3 行,但某些数据缺少特定于产品的数据

这是我正在做的一个简化示例

选择 sb_carts.product_sku FROM sb_carts 内部加入 sb_products ON sb_products.sku = sb_carts.product_sku 和 sb_products.school_id = sb_carts.school_id 哪里 sb_carts.order_id = 0 AND sb_carts.user_id = 2 分组 sb_carts.cart_id

完整的查询看起来像

选择 COUNT(DISTINCT sb_carts.cart_id) 作为数量, sb_carts.* FROM sb_carts INNER JOIN sb_children ON sb_children.child_id = sb_carts.child_id 内部加入 sb_school_entities ON sb_school_entities.school_id = sb_children.school_id 内部加入 sb_products ON sb_products.sku = sb_carts.product_sku AND sb_products.school_id = sb_carts.school_id 左加入 sb_houses ON sb_children.house_id = sb_houses.id 左加入 sb_refund_cart ON sb_carts.cart_id = sb_refund_cart.cart_id 哪里 sb_carts.order_id = 0 AND sb_carts.user_id = 2 按 sb_carts.child_id、sb_carts.product_sku、sb_carts.school_id 分组 按 sb_children.dob_year、sb_children.dob_month、sb_children.dob_day ASC 排序

【问题讨论】:

    标签: mysql inner-join


    【解决方案1】:

    问题很可能是GROUP BY。这将只返回每个购物车 ID 的一条记录,即使购物车中有多个产品。要得到你想要的,试试这个:

    选择 sb_carts.cart_id、sb_carts.product_sku FROM sb_carts 内部加入 sb_products ON sb_products.sku = sb_carts.product_sku 和 sb_products.school_id = sb_carts.school_id 哪里 sb_carts.order_id = 0 AND sb_carts.user_id = 2 由 sb_carts.cart_id 订购

    这将返回两列(购物车 ID 和 SKU)而不是一列,并且一个购物车 ID 的所有商品将在查询中显示为连续行。

    【讨论】:

    • 是的,就是这样。如果您使用 GROUP BY,MySQL 不会强制您使用聚合函数(例如,与 MS-SQL 不同,该查询无效)
    【解决方案2】:

    您为什么使用Group By 语句?如果您没有使用 Select 中的函数,例如 SumAVG 等,则对您的海豚没有任何意义。 因此,请尝试在不使用 Group By 语句的情况下运行查询 :-)

    希望对你有帮助!

    桑蒂! :-)

    【讨论】:

    • 我的完整查询利用计数将​​类似产品组合在一起作为数量。 SELECT COUNT(DISTINCT sb_carts.cart_id) 作为数量,
    【解决方案3】:

    Mysql INNER JOIN 在多个键上:

    SELECT * from table1 as t1
    INNER JOIN table2 as t2
    ON CONCAT(t1.key1, t2.key2)=CONCAT(t2.key1, t2.key2);
    

    我们在这里所做的是将两个键的值组合起来,让它看起来像是一个键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-17
      • 2014-07-23
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      • 2019-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多