0
votes

Comment combiner deux tables avec des dates différentes et rejoindre une autre table?

J'essaie actuellement d'effectuer une requête avec Laravel / Eloquent mais j'ai décidé d'écrire d'abord la requête SQL afin de déterminer quel est le problème. Je souhaite regrouper par dates et combiner les résultats de deux tables en utilisant plusieurs jointures, mais les résultats sont erronés lorsque j'ajoute la table product_metrics comme ceci:

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

 Schéma de base de données

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

Ce que je veux / dois faire est: Recherchez les produits avec une clause where et ajoutez également des dates pour obtenir tous les product_metrics et tous les customer_orders liés à ces produits dans la période donnée.


3 commentaires

Montrez-nous le schéma de base de données, des exemples de données, la sortie actuelle et attendue. Veuillez lire Comment demander Et voici un endroit idéal pour START pour découvrir comment améliorer la qualité de vos questions et obtenir de meilleures réponses. Comment créer un exemple minimal, complet et vérifiable Essayez de créer un exemple dans rextester.com


Publiez les tableaux et les données sous forme de texte LIRE CECI


Sans données ni sortie désirée, nous ne savons pas ce qui ne va pas. Mes suggestions sont de simplifier votre problème à SELECT * FROM Produits , puis de commencer à ajouter des tableaux un par un. Mais je pense que vous ne pouvez pas rejoindre marketplace et product_metrics en même temps que les clients . C'est pourquoi vous avez tant de lignes. Vous verrez que lorsque vous modifiez votre requête en SELECT *


3 Réponses :


0
votes

Voulez-vous dire ...

              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)

?

En outre, il est beaucoup plus facile de suivre si vous alias vos tables et qualifiez vos colonnes avec ces alias.

/ p>


2 commentaires

Si tel était le cas, les parenthèses n'en ont pas besoin, je pense que c'est l'inverse


Merci pour votre approche, j'ai répondu ci-dessous la réponse de Juans



0
votes

Je suppose qu'il vous manque la parenthèse pour vous assurer que le OU est d'abord manipulé.

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
)

Vous voulez probablement

( A or B ) and C

Alors

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


1 commentaires

@Strawberry et Juan, de toute façon mes résultats pour les ventes (table customer_orders) augmentent par exemple de (700 à 80k) juste en rejoignant la table product_metrics



0
votes

Compte tenu de la relation un à plusieurs entre les produits et les statistiques, cela se passe comme prévu.


0 commentaires