1
votes

Est-il possible de créer une requête MySQL comme celle-ci?

J'ai deux tables. Je voudrais créer une requête qui renvoie toutes les lignes d'une table où la somme des valeurs entières de la colonne de la table est inférieure à une valeur spécifique.

Imaginez que les tableaux ressemblent à:

Comptes :

USERID | VALUE | DATE
4594 .   10000 . XX/XX/XX 00:00:00  
2414 .   10000 . XX/XX/XX 00:00:00  
1894 .   10000 . XX/XX/XX 00:00:00  
6974 .   10000 . XX/XX/XX 00:00:00  
3491 .   10000 . XX/XX/XX 00:00:00  
1590 .   10000 . XX/XX/XX 00:00:00  
6554 .   10000 . XX/XX/XX 00:00:00  

Historique :

USERID | STATUS | LAST_LOGIN_DATE | etc......
4594 . 1 . XX/XX/XX 00:00:00 . etc.....
2414 . 1 . XX/XX/XX 00:00:00 . etc.....
1894 . 1 . XX/XX/XX 00:00:00 . etc.....

Je voudrais SELECT Accounts. * FROM Accounts mais à la condition que par exemple pour chaque userid la colonne value est inférieure à par exemple 30 000 . Est-ce possible dans MySQL? Merci.


1 commentaires

Il n'y a pas de doublons dans Historique . Alors, quelle serait "la somme des valeurs entières"? Soyez plus concret et modifiez votre question.


3 Réponses :


2
votes

n'existe pas ce que vous voulez?

select a.*
from accounts a
where not exists (select 1
                  from history h
                  where h.userid = a.userid and h.value >= 30000
                 );


0 commentaires

1
votes

Vous indiquez que la somme de la colonne value est inférieure à 30000, n'est-ce pas?

select *
from accounts 
where userid not in (
  select userid
  from history
  where date >= date_sub(curdate(), interval 0 day)
  group by userid
  having sum(value) >= 30000
)

ou:

select a.*
from accounts a inner join (
  select userid
  from history
  group by userid
  having sum(value) < 30000
) t on t.userid = a.userid

Modifier :
Pour appliquer une condition swcond pour la date:

select a.*
from accounts a
where (
  select sum(h.value)
  from history h
  where h.userid = a.userid
) < 30000


4 commentaires

Oui, je l'ai fait, merci. J'ai un problème cependant, j'essaie d'utiliser la première requête que vous avez suggérée mais je veux ajouter une autre condition dans cette instruction de sélection interne qui est date> = DATE_SUB (CURDATE (), INTERVAL 0 DAY) car je ne fais que partir de la somme de le jour en cours. Cependant, lorsque j'ajoute cela, aucune ligne n'est renvoyée. Comme je n'ai ajouté aucune ligne aujourd'hui, la somme devrait être égale à 0, ce qui serait inférieur à 30000 et devrait donc me renvoyer toutes les lignes utilisateur / compte. @forpas


Non, vous ne pouvez pas faire cela en y appliquant cette condition. La condition date> = DATE_SUB (CURDATE (), INTERVAL 0 DAY) ne fera pas la somme de la valeur de la colonne pour les lignes qui ne sont pas là, donc elle n'obtiendra pas comme résultat 0 .


Un moyen de définir comme zéro sinon là?


Correction, j'ai utilisé un scénario CASE WHEN dans l'instruction select merci.



0
votes

Vous pouvez utiliser la requête ci-dessous:

select accounts.* from accounts inner join history on history.userid = accounts.userid where history.value >= 30000

J'espère que cela vous aidera.


0 commentaires