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
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 Réponses :
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>
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
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 )
@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
Compte tenu de la relation un à plusieurs entre les produits et les statistiques, cela se passe comme prévu.
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 b> 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 rejoindremarketplace
etproduct_metrics
en même temps que lesclients
. C'est pourquoi vous avez tant de lignes. Vous verrez que lorsque vous modifiez votre requête enSELECT *