2017-10-15 1 views
0

je veux joindre deux tables, mais je ne peux pas le faire comme je veux résumer la colonne et obtenir le résultat entre deux datescombiner deux tables et somme mysql

première table nommée: vip_allotment_details

allotment_id qty 
2    3 
2    5 
1    2 
1    4 

le deuxième nom de la table: vip_allotment

id date_from date_to 
1 2017-10-1 2017-10-5 
2 2017-10-6 2017-10-10 

ce que je veux de la requête pour me obtenir ce résultat

id qty date_from date_to 
1  6 2017-10-1 2017-10-5 
2  8 2017-10-6 2017-10-10 

je vais vous expliquer le résultat:

premier champ allotment_id est lié avec le champ id dans le deuxième tableau, le résultat je veux que nous pouvons faire la somme des qté par les deux champs (id, allotment_id) entre le date_from et date_to

et voici mon essai:

$query1 = " 
SELECT SUM(qyt) as total 
    FROM vip_allotment_details 
where allotment_id IN (SELECT id from vip_allotment where date_from >= '$date_1' AND date_to <= '$date_2') 
"; 

Dans ma requête le résultat obtient tout la somme de champ qty sans filtre ..

J'espère avoir bien expliqué mon problème.

merci /.

Répondre

0

Je ne suis pas encore essayer, mais peut-être vous pouvez essayer comme ceci:

SELECT a.id AS id, SUM(qyt) AS qty, date_from, date_to 
FROM vip_allotment AS a 
LEFT JOIN vip_allotment_details AS b on b.allotment_id = a.id 
WHERE a.date_from >= '{thedatestart}' AND a.date_to <= '{thedateend}' 
GROUP BY a.id 
ORDER BY a.id ASC; 
+0

merci homme, il fonctionne, mais je dois faire plage de dates comme date_from> = « quelque chose » et date_to <= « quelque chose » vous désirez me dire comment l'appliquer sur votre requête –

+0

Ok, il suffit de mettre WHERE clause sur cette requête 'WHERE a.date_from> = '{thedatestart}' ET a.date_to <= '{thedateend}'' –

+0

Votre bienvenue, passez une bonne journée :) –

0

Essayez this..change votre nom de la table et exécutez le query..hopefully il devrait donner le résultat que votre exigence. .Si moi laisse pas ...

select a.id 
    , sum(b.qty) 
    , a.date_from 
    , a.date_to 
    from table1 a 
    , table2 b 
where a.id = b.allotment_id 
group 
    by b.allotment_id 
0

Vous devez utiliser JOIN. Je vois que vous utilisez le mot-clé IN, qui ne fonctionnera pas. Il peut y avoir plusieurs façons de résoudre votre problème. L'un d'eux est,

select allotment_id, qty, date_from, date_to 
from 
(select allotment_id, SUM(qty) as qty 
    from vip_allotment_details group by allotment_id 
) at 
INNER JOIN 
vip_allotment va 
ON va.id= at.allotment_id; 
0

Si vous voulez plus d'un résultat forme une fonction d'agrégation (SUM, COUNT, AVG, ...), vous devez utiliser un GROUP BY. Votre requête est pas difficile, cela devrait faire l'affaire:

SELECT va.id, va.date_from, va.date_to, SUM(vad.qyt) AS qyt 
FROM vip_allotment AS va 
LEFT JOIN vip_allotment_details AS vad ON vad.allotment_id = va.id 
GROUP BY va.id 

Et comme vous pouvez le voir ici, cela produit le résultat escompté: http://sqlfiddle.com/#!9/707a8/2

Si vous voulez maintenant commencer à ajouter des filtres supplémentaires (comme filtrer par date), vous pouvez simplement le faire en ajoutant un WHERE à la requête. Quelque chose comme ceci:

... 
LEFT JOIN ... 
WHERE va.date_from >= "2017-10-06" and va.date_to <= "2018-10-06" 
GROUP BY ... 

http://sqlfiddle.com/#!9/707a8/6

Sur une note de côté, je remarque que vous n'êtes pas liez votre params dans la partie php de votre code. Notez que cela peut poser de sérieux problèmes de sécurité, surtout si ces dates proviennent directement de l'entrée de l'utilisateur. Je suggère de regarder PDO pour faire l'interrogation réelle en PHP.

+0

j'apprécie vraiment et il travaille l'homme merci, mais je veux faire une gamme comme de date_from à date_to comme un filtre pour le résultat –

+0

sry, j'ai raté la partie filtre. Laissez-moi mettre à jour ma réponse ... – Pevara

0

Je pense que ce qui suit devrait faire ce que vous demandez.

SELECT 
    va.id, 
    SUM(vad.qyt) AS total, 
    va.date_from, 
    va.date_to 
FROM vip_allotment_details AS vad 
LEFT JOIN vip_allotment AS va ON va.id = vad.allotment_id 
GROUP BY vad.allotment_id 
0

Essayez ci-dessous.je crois que vous obtiendrez le résultat souhaité.

select va.id, temp.qty , va.date_from,va.date_to from vip_allotment as va 
inner join (select sum(qty) as qty , allotment_id from vip_allotment_details group by `allotment_id`) as temp 
ON temp.allotment_id=va.id 
where va.date_from >= '$date_1' AND va.date_to <= '$date_2';