【问题标题】:get all customer payment based on order id根据订单 ID 获取所有客户付款
【发布时间】:2018-06-07 11:18:58
【问题描述】:

我想知道是否有人可以帮助我处理这个复杂的 mysql 查询。

我有 3 张桌子:

表 #1:Customer_Order 有两列 customer_idorder_id
表 #2:Order_Payment 也有 order_id
表 #3:Orders 有一个 id,这是一个订单 ID。

如果可以根据order_id 检索特定客户的所有付款,我正在徘徊。我只有一个order_id,但我没有customer_id,基于order_id,我应该能够检索所有付款,甚至是那些尚未付款的付款。

这就是我的做法:

我首先检索已知的订单

select * from customer_order where order_id = 1351

然后我尝试根据返回的内容构建查询

选择 * from (
    select * from customer_order where order_id = 1351
) c1
左连接
    (select op.order_id, customer_id from order_payment op inner join customer_order co on op.order_id = co.order_id
    ) c2 上 c1.customer_id = c2.customer_id

我也试试

从 (
    从 `order_payment` 中选择 customer_id 内部加入 `customer_order` on `customer_order`。`order_id` = `order_payment`.`order_id`
    其中 order_payment.order_id=1351
    按 `created_at` asc 排序)作为 s
在 s.customer_id = customers.id 上内部加入客户

但我只收到一笔订单付款,而不是那些尚未付款的订单。

如果有人能帮助我解决问题,我将不胜感激。

【问题讨论】:

  • 你希望你的输出看起来如何?
  • 我会跳过直接的 SQL 查询,而是利用 Laravel 的 Eloquent 和关系。
  • 我只是想不出在 Laravel 中做到这一点的方法。我的意思是我的订单有一个透视表——customer_order 和 order_payment,但是如何将它们全部连接在一起以显示已支付的内容,而不是我做不到的。我能做的是运行查询两次。首先检索已支付的所有内容,然后运行尚未支付的所有内容。但这是正确的方法吗?

标签: php mysql laravel-5.3


【解决方案1】:

您可以通过customer_order 加入两次。一次从给定的order_id 转到customer_id,然后第二次获取所有客户的订单。

select op.*
FROM order_payment AS op
JOIN customer_order AS co1 ON co1.order_id = op.order_id
JOIN customer_order AS co2 ON co2.customer_id = co1.customer_id
WHERE co2.order_id = 1351

我认为没有任何理由使用LEFT JOINorder_payment 中的列应该是外键,所以总会有匹配的。

【讨论】:

  • 我尝试了查询,但只检索到一笔订单付款。我需要的是获得已付款和未付款的订单。如果我有 10 个来自同一客户的订单,并且只有 1 个已付款,我应该会看到 1 个已付款和 9 个未付款
  • 问题是检索特定客户的所有付款。未付款订单如何付款?
【解决方案2】:

这样的事情应该可以工作:

SELECT 
    co.*,
    op.*
FROM
    customer_order AS co
    LEFT JOIN order_payment AS op ON op.order_id = co.order_id

WHERE
    co.customer_id IN 
    (
         SELECT customer_id FROM customer_orders WHERE order_id=1351
    )

【讨论】:

  • 我尝试了查询,但只检索到一笔订单付款。我需要的是获得已付款和未付款的订单。如果我有 10 个来自同一客户的订单,并且只有 1 个已付款,我应该会看到 1 个已付款和 9 个未付款
  • 所以你想要的是订单而不是付款。所有订单(无论是否有付款)以及是否有付款还有付款信息?尝试修改后的查询。
【解决方案3】:

我最终运行了 2 个查询。首先加载已完成特定订单付款的客户,然后为该客户加载未付款订单。

感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 2014-12-29
    • 2014-07-10
    • 2019-06-25
    • 2021-07-18
    • 2018-12-12
    • 2018-03-16
    • 1970-01-01
    • 2015-09-23
    • 2022-07-16
    相关资源
    最近更新 更多