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.
3 Réponses :
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
);
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
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.
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.
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.