【问题标题】:How to combine two tables with different dates and join on other table?如何组合两个不同日期的表并加入另一个表?
【发布时间】:2019-06-17 13:34:24
【问题描述】:

我目前正在尝试使用 Laravel / Eloquent 执行查询,但我决定先编写 SQL 查询以找出问题所在。 我想按日期分组并使用多个连接组合两个表的结果,但是当我像这样添加 product_metrics 表时结果出错:

inner join `product_metrics` on `products`.`id` = `product_metrics`.`product_id`

select
  date_format(`date` + INTERVAL 1 HOUR, '%Y-%m-%d') as day,
  round(sum(`item_price` * `quantity_ordered`), 2) as sales,
  sum(`quantity_ordered`) as units,
  sum(
    CASE
      WHEN `is_refund` THEN `item_price` * `quantity_ordered`
      ELSE 0
    END
  ) as refunds,
  sum(
    CASE
      WHEN `is_refund` THEN `quantity_ordered`
      ELSE 0
    END
  ) as refund_units,
  sum(`promotion_discount`) as discounts,
  sum(`sessions`) as sessions,
  count(DISTINCT(customer_order_id)) as orders,
  round(sum(`product_sales`), 2) as sales_sc,
  round(
    sum(`unit_session_percentage` * `product_sales`) / sum(`product_sales`),
    2
  ) as cvr,
  sum(`page_views`) as views

from
  `products`
  inner join `product_brands` on `products`.`brand_id` = `product_brands`.`id`
  inner join `customer_order_items` on `products`.`id` = `customer_order_items`.`product_id`
  inner join `customer_orders` on `customer_order_items`.`customer_order_id` = `customer_orders`.`id`
  inner join `product_metrics` on `products`.`id` = `product_metrics`.`product_id`
  inner join `customers` on `products`.`customer_id` = `customers`.`id`
  inner join `marketplaces` on `products`.`marketplace_id` = `marketplaces`.`id`
  where
  (
    `date` between "2019-05-01 00:00:00"
    and "2019-05-31 00:00:00"
    or `purchase_date` between "2019-05-01 00:00:00"
    and "2019-05-31 00:00:00"
    and `customers`.`id` = 18
  )
  and `products`.`deleted_at` is null
group by
  date_format(`date` + INTERVAL 1 HOUR, '%Y-%m-%d')
order by
  `day` asc

我想要/需要做的是: 使用 where 子句查询 products 并添加日期以获取在给定时间段内与这些产品相关的所有 product_metrics 和所有 customer_orders

【问题讨论】:

  • 向我们展示数据库架构、示例数据、当前和预期输出。请阅读How-to-Ask 这里是START 了解如何提高问题质量并获得更好答案的好地方。 How to create a Minimal, Complete, and Verifiable example 尝试在rextester.com 中创建样本
  • 将表格和数据发布为文本READ THIS
  • 没有数据或期望输出,我们不知道出了什么问题。我的建议是将您的问题简化为SELECT * FROM Products,然后开始一一添加表格。但我认为你不能和customers同时加入marketplaceproduct_metrics。这就是为什么你有这么多行。当您将查询更改为 SELECT * 时,您会看到

标签: mysql laravel laravel-5 eloquent


【解决方案1】:

你是说……

              date between "2019-05-01 00:00:00" and "2019-05-31 00:00:00"
or ( purchase_date between "2019-05-01 00:00:00" and "2019-05-31 00:00:00"
 and customers.id = 18)

?

此外,如果您为表加上别名,并使用这些别名限定列,则更容易遵循。

【讨论】:

  • 如果是这样的话,括号不需要它,我认为是另一种方式
  • 感谢您的方法,我在下面的 Juans 回答中回答了
【解决方案2】:

我的猜测是您缺少括号以确保首先处理 OR。

A or B and C ==> A or ( B and C )

你可能想要

( A or B ) and C

所以

where
(
  (    `date` between "2019-05-01 00:00:00" and "2019-05-31 00:00:00"
    or `purchase_date` between "2019-05-01 00:00:00" and "2019-05-31 00:00:00"
  )
  and `customers`.`id` = 18
)

【讨论】:

  • @Strawberry 和 Juan,无论哪种方式,我对 sales (customer_orders table) 的结果都增加了,例如,加入 product_metrics 表后,我的结果从(700 到 80k)增加了
【解决方案3】:

考虑到产品和指标之间的一对多关系,这符合预期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 2020-06-23
    • 2022-06-10
    • 2019-04-30
    • 2020-07-28
    相关资源
    最近更新 更多