J'ai 4 tables.
table_orders p> table_order_details p> table_order_status p> 1 200.00 12:12:2015 3 19:42:47 CONFIRM
4 Réponses :
Vous devez concentrer le premier sous-sélection pour obtenir toutes les informations de commande, à l'exception de cet état, puis rejoindre les informations d'état.
Cela pourrait ressembler à ceci: p>
SELECT
o.order_id AS order_id,
tosv.value_description AS current_status,
SUM(od.product_sell_price * od.quantity) AS amount,
DATE_FORMAT(o.order_datetime, '%d/%m/%Y') AS `date`,
SUM(od.quantity) AS quantity,
TIME(o.order_datetime) AS `time`
FROM table_orders AS o
INNER JOIN table_order_status_values AS tosv
ON o.order_status_id = tosv.value_id
INNER JOIN table_order_details AS od
ON o.order_id = od.order_id
GROUP BY o.order_id
ORDER BY o.order_id DESC
Vous problème est dans la présente partie: La somme ne renvoie pas la valeur actuelle car elle se multiplie avec chaque jointure. P> Vous pouvez résoudre ce problème. Obtenir cela avec un SELECT au lieu d'utiliser uniquement les colonnes. p> et pour la quantité utilisée: p> donc le La requête finale sera la suivante: p> et il va sortir: p> pas besoin de le joindre à cette requête p> p>
Tout d'abord, votre SQL n'est pas valide, MySQL ignore ce SQL non valide mais le résultat ne sera pas ce que vous attendez.
SELECT o.order_id,
oo.amt,
DATE_FORMAT(o.order_datetime, '%d/%m/%Y') date,
oo.qty,
TIME(o.order_datetime) time,
osv.value_desc
FROM table_orders o, table_order_status_values osv, (
SELECT order_id, sum(quantity) qty, sum(product_sell_price*quantity) amt
FROM table_order_details
GROUP BY 1
) AS oo, (
SELECT order_id, max(status_id) last_status
FROM table_order_status
GROUP BY 1
) AS os
WHERE o.order_id = os.order_id AND os.last_status = osv.status_id
AND o.order_id = oo.order_id
La sous-requête que vous avez utilisée sans groupe en et Sum / max:
1 200 2015:12:12 319:42:47 2
Pouvez-vous montrer un exemple de sortie? Il est probable que la jointure sur
table_order_status code>. Peut-être que vous n'avez besoin que d'obtenir le dernier statut, pas toutes les valeurs intermédiaires@Alextartan, j'ai eu ton point. Mais j'utilise Max (Status_ID) pour obtenir le dernier statut de cet ordre.
Bien que pas aussi correct, vous pourrait i> utiliser
Sélectionnez Distinct Oo.order_id ... code>. Ou essayez de rejoindre un sous-sélection detable_order_status code> déjà regroupé par ordre_id, au lieu de toute la table. Si vous parvenez à configurer un violon SQL ( SQLFIDDLE.com ) Je pouvais jeter un coup d'oeilQu'est-ce qui est avec
Somme (OD.Product_Sell_Price * OD.Quantitity) comme montant code> au lieu deOD.Product_sell_price * OD.Quanity en tant que montant code>?