J'essaye vainement de faire un comptage un peu particulier sur une de mes tables, le tout si possible en full SQL...
Je vais déjà vous présenter la requête d'affichage, à partir de laquelle je souhaiterai faire mon "comptage"...
Voici la bête:
SELECT
t2 . *
FROM
transactions AS t
LEFT JOIN
orders AS o
ON
o.id_order = t.ref_order
LEFT JOIN
transactions AS t2
ON
t2.id_transaction = t.id_transaction
WHERE
t.account_num = 123
OR o.ref_user = 123
GROUP BY t2.id_auto
Et voici le contenu (simplifié) des tables transactions et orders:
--
-- Structure de la table `transactions`
--
CREATE TABLE IF NOT EXISTS `transactions` (
`id_auto` int(10) unsigned NOT NULL AUTO_INCREMENT,
`id_transaction` int(10) unsigned NOT NULL,
`ref_order` int(11) DEFAULT NULL,
`ref_account_type` int(11) NOT NULL,
`account_num` int(11) DEFAULT NULL,
`libelle` varchar(250) DEFAULT NULL,
`debit` float DEFAULT '0',
`credit` float DEFAULT '0',
`vat` float DEFAULT '0',
`amount_ht` float DEFAULT NULL,
`blocked_payment_target` int(11) DEFAULT NULL,
`date_payment_insert` datetime DEFAULT NULL,
`date_payment_valid` datetime DEFAULT NULL,
`date_modification` datetime DEFAULT NULL,
`date_extraction` datetime DEFAULT NULL,
`date_extraction_wanted` datetime DEFAULT NULL,
`canceled` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id_auto`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=13 ;
--
-- Contenu de la table `transactions`
--
INSERT INTO `transactions` (`id_auto`, `id_transaction`, `ref_order`, `ref_account_type`, `account_num`, `libelle`, `debit`, `credit`, `vat`, `amount_ht`, `blocked_payment_target`, `date_payment_insert`, `date_payment_valid`, `date_modification`, `date_extraction`, `date_extraction_wanted`, `canceled`) VALUES
(1, 1, 1, 5116, 14, 'Opération n°1', 29, 0, 4.75, 24.24, NULL, '2010-10-19 09:46:17', '2010-10-19 09:46:24', NULL, NULL, NULL, 0),
(2, 1, 1, 4671, 123, 'Opération n°1', 0, 29, 4.75, 24.24, NULL, '2010-10-19 09:46:17', '2010-10-19 09:46:24', NULL, NULL, NULL, 0),
(3, 3, 1, 4671, 123, 'Opération n°1', 29, 0, 4.75, 24.24, NULL, '2010-10-19 09:46:17', '2010-10-19 09:46:25', NULL, NULL, NULL, 0),
(4, 3, 1, 411, 123, 'Opération n°1', 0, 29, 4.75, 24.24, NULL, '2010-10-19 09:46:17', '2010-10-19 09:46:25', NULL, NULL, NULL, 0),
(5, 5, 2, 5112, 12, 'Opération n°2', 29, 0, 4.75, 24.24, NULL, '2010-10-19 09:49:39', '2010-10-19 09:50:09', NULL, NULL, NULL, 0),
(6, 5, 2, 4671, 123, 'Opération n°2', 0, 29, 4.75, 24.24, NULL, '2010-10-19 09:49:39', '2010-10-19 09:50:09', NULL, NULL, NULL, 0),
(7, 7, 2, 4671, 123, 'Opération n°2', 29, 0, 4.75, 24.24, NULL, '2010-10-19 09:49:39', '2010-10-19 09:50:09', NULL, NULL, NULL, 0),
(8, 7, 2, 411, 123, 'Opération n°2', 0, 29, 4.75, 24.24, NULL, '2010-10-19 09:49:39', '2010-10-19 09:50:09', NULL, NULL, NULL, 0),
(9, 9, NULL, 5116, 14, 'Opération n°3', 29, 0, 4.75, 24.24, NULL, '2010-10-19 11:32:46', '2010-10-19 11:32:46', NULL, NULL, NULL, 0),
(10, 9, NULL, 4671, 123, 'Opération n°3', 0, 29, 4.75, 24.24, NULL, '2010-10-19 11:32:46', '2010-10-19 11:32:46', NULL, NULL, NULL, 0),
(11, 11, NULL, 5116, 14, 'Opération n°4', 29, 0, 4.75, 24.24, NULL, '2010-10-19 14:41:31', '2010-10-19 14:41:31', NULL, NULL, NULL, 0),
(12, 11, NULL, 4671, 123, 'Opération n°4', 0, 29, 4.75, 24.24, NULL, '2010-10-19 14:42:13', '2010-10-19 14:42:13', NULL, NULL, NULL, 0);
--
-- Structure de la table `orders`
--
CREATE TABLE IF NOT EXISTS `orders` (
`id_order` int(11) NOT NULL AUTO_INCREMENT,
`ref_user` int(11) NOT NULL
PRIMARY KEY (`id_order`,`ref_user`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
--
-- Contenu de la table `orders`
--
INSERT INTO `orders` (`id_order`, `ref_user`,) VALUES
(1, 123),
(2, 123);
Le problème c'est qu'ensuite, pour l'affichage, je fait un traitement php un peu complexe (du moins à traiter en sql) que voilà:
while($transact = mysql_fetch_assoc($results)){
// commande associée
if(!empty($transact['ref_order'])){
if(!isset($formated_results['o'.$transact['ref_order']])){
$formated_results['o'.$transact['ref_order']] = array(
'line_type'=>'order',
'ref_order'=>$transact['ref_order']
);
}
if($transact['ref_account_type']==transaction::USER_CA){
$formated_results['o'.$transact['ref_order']]['id_transaction']=$transact['id_transaction'];
$formated_results['o'.$transact['ref_order']]['libelle']=$transact['libelle'];
$formated_results['o'.$transact['ref_order']]['date_payment_insert']=$transact['date_payment_insert'];
$formated_results['o'.$transact['ref_order']]['date_payment_valid']=$transact['date_payment_valid'];
}
if($transact['account_num']<100){
$formated_results['o'.$transact['ref_order']]['payment_way']=$transact['nom_payment_way'];
$formated_results['o'.$transact['ref_order']]['amount_ttc']=$transact['debit'];
$formated_results['o'.$transact['ref_order']]['amount_ht']=$transact['amount_ht'];
$formated_results['o'.$transact['ref_order']]['vat']=$transact['vat'];
}
}
// paiement tout seul
else {
if(!isset($formated_results['t'.$transact['id_transaction']])){
$formated_results['t'.$transact['id_transaction']] = array(
'line_type'=>'transaction',
'id_transaction'=>$transact['id_transaction'],
'ref_order'=>null
);
}
if($transact['account_num']<100){
$formated_results['t'.$transact['id_transaction']]['payment_way']=$transact['nom_payment_way'];
$formated_results['t'.$transact['id_transaction']]['amount_ttc']=$transact['debit'];
$formated_results['t'.$transact['id_transaction']]['amount_ht']=$transact['amount_ht'];
$formated_results['t'.$transact['id_transaction']]['vat']=$transact['vat'];
$formated_results['t'.$transact['id_transaction']]['libelle']=$transact['libelle'];
$formated_results['t'.$transact['id_transaction']]['date_payment_insert']=$transact['date_payment_insert'];
$formated_results['t'.$transact['id_transaction']]['date_payment_valid']=$transact['date_payment_valid'];
}
}
}
En bref, ça rend ceci sur le papier (pas de commentaires sur le design siouplai :-°)
En gros, lorsqu'une commande est associé à un paiement, je condense quatre enregistrements en un, et lorsque ça n'est pas le cas, je combine de enregistrement en un...
Donc j'ai testé un
SELECT COUNT(*) FROM transactions GROUP BY ref_order
pour ensuite compter le nombre des résultats retournés (une ligne par commande) sauf que bien sûr tous les paiements qui ne sont pas liés à une facture sont regroupés et on perd le décompte... :/J'avoue que je reste bloqué!
Merci d'avance pour votre aide, n'hésitez pas à demander plus d'infos!
Cordialement,