Как совместить две таблицы с разными датами и объединить на другой таблице? - PullRequest
0 голосов
/ 17 июня 2019

В настоящее время я пытаюсь выполнить запрос с помощью Laravel / Eloquent, но я решил сначала написать SQL-запрос, чтобы выяснить, в чем проблема. Я хочу сгруппировать по датам и объединить результаты двух таблиц, используя несколько объединений, но результаты получаются неправильными, когда я добавляю таблицу product_metrics следующим образом:

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

Database Schema

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

Что я хочу / нужно сделать, это: Запросите products с предложением where, а также добавьте даты, чтобы получить все product_metrics и все customer_orders, связанные с этими продуктами за указанный период времени.

Ответы [ 3 ]

0 голосов
/ 17 июня 2019

Полагаю, вы пропустили скобку, чтобы убедиться, что ИЛИ обрабатывается первым.

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
)
0 голосов
/ 17 июня 2019

Учитывая соотношение один ко многим между продуктами и метриками, это соответствует ожиданиям.

0 голосов
/ 17 июня 2019

Вы имели в виду ...

              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)

?

Кроме того, гораздо проще следить, если вы используете псевдонимы для своих таблиц и квалифицируете свои столбцы с этими псевдонимами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...