Requête apparement simple, mais ... [MySQL] - SQL/NoSQL - Programmation
Marsh Posté le 31-01-2007 à 14:14:06
Oui parce que, si je ne me trompe pas, ça ferais 2^5 combinaisons possibles, soit plus de 3000... 2^30 combinaisons possibles.
Bref. Et si tu les met en int(1) (par exemle) et en considérant que 1 vaut true et 0 false, tu peux faire la somme de tout les champs et vérifier si elle est supérieur à 3.
Edit: Simple proposition, ya certainement mieux.
Marsh Posté le 31-01-2007 à 14:23:19
Tient, c'est pas con ton truc. Mais ces champs sont des booléens et je ne peux pas me permettre de les changer comme ça. ça impliquerait trop de changements par ailleurs.
Marsh Posté le 31-01-2007 à 15:04:24
cast les en char, concat les tous et dessus fais un regex ou un str_index (en fonction de ton sgbd)
edit: je tiens à dire que cette methode sera particulièrement lente,
Marsh Posté le 31-01-2007 à 15:06:12
Requête apparement simple, mais ... avec un MCD mal conçu, ça devient une grosse galère Je trouve que la solution de dwogsi est la plus simple à mettre en oeuvre si tu ne veux pas modifier ton MCD.
Perso, j'aurais fait 3 tables
- table Personnes
- table Problemes
- table liant les personnes à leurs problèmes
Après, y'a pu qu'à faire un COUNT() du nb de pb par personne et ne garder que ceux en ayant >= 3...
Marsh Posté le 31-01-2007 à 15:07:30
anapajari a écrit : cast les en char, concat les tous et dessus fais un regex ou un str_index (en fonction de ton sgbd) |
et pourquoi pas les caster en int à ce moment là. Comme ça, on retombe sur la 1ère solution proposée...Ca serait plus simple et plus rapide je pense...
Marsh Posté le 31-01-2007 à 15:10:23
rufo a écrit : et pourquoi pas les caster en int à ce moment là. Comme ça, on retombe sur la 1ère solution proposée...Ca serait plus simple et plus rapide je pense... |
oui ça marche aussi et c'est plus simple
Marsh Posté le 31-01-2007 à 16:00:44
rufo a écrit : Requête apparement simple, mais ... avec un MCD mal conçu, ça devient une grosse galère Je trouve que la solution de dwogsi est la plus simple à mettre en oeuvre si tu ne veux pas modifier ton MCD. |
T'as très certainement raison. Ton modèle seraient sans doute beaucoup + souple. Mais c'est une petite base de données que j'ai fait rapidement, avec Base (l'équivalent d'Access, pour OpenOffice). Ta méthode aurait été beaucoup plus compliqué à interfacer avec Writer (pour l'interface de saisie de données). Bref, ...
Merci quand même.
Et caster des champs à la volée (bool => tinyint) dans une requète MySQL, vous croyez que c'est possible ? (si oui, comment ?)
Marsh Posté le 31-01-2007 à 16:11:21
http://dev.mysql.com/doc/refman/5. [...] tions.html
t'as pas tinyint mais signed fera très bien l'affaire
Marsh Posté le 31-01-2007 à 16:38:48
mysql sait pas faire un cast entre un bool et un int ?
même Access sait faire
Marsh Posté le 31-01-2007 à 16:39:46
sinon, stocker en colonne des données qui devraient être sous forme de lignes, c'est mal.
drop table personnes; |
et tu recommences avec un modèle propre
Marsh Posté le 31-01-2007 à 17:08:38
le problème c'est que dès qu'il y a un champ NULL, le total est NULL. J'éspérais que ce cast transformerait les NULL en 0. Apparement c'est pas le cas. vous voyez comment je pourrais faire ? (sachant que je dois garder ces NULL en base)
Marsh Posté le 31-01-2007 à 17:11:25
MagicBuzz a écrit : sinon, stocker en colonne des données qui devraient être sous forme de lignes, c'est mal.
|
Justement, je me disais que ce topic manquait d'intégristes...
Plus sérieusement, regarde qqs posts au dessus, j'explique pourquoi j'avais fait ce choix. J'ai peut être eu tord, mais là, très franchement, j'en suis plus au moment ou je vais refondre tout mon MCD. C'est un petit extra que je fais bénévolement pour une asso. Là, je cherche à faire un truc stable et fonctionnel rapidement. Quitte à refondre tout ça un peu plus proprement après.
Marsh Posté le 31-01-2007 à 17:58:52
El_gringo a écrit : Justement, je me disais que ce topic manquait d'intégristes... |
Si t'es prêt à refondre ton appli après, pourquoi pas le faire maintenant? Avec ton MCD, tu risques de perdre plein de temps à chaque fois que tu vas vouloir extraire telle ou telle info, alors qu'avec un modèle propre, ça te prendrait 2 mins
ps : pas de chance pour toi, MagicBuzz viens de débarquer sur ton topic...t'es cuit
Marsh Posté le 31-01-2007 à 18:39:08
El_gringo a écrit : le problème c'est que dès qu'il y a un champ NULL, le total est NULL. J'éspérais que ce cast transformerait les NULL en 0. Apparement c'est pas le cas. vous voyez comment je pourrais faire ? (sachant que je dois garder ces NULL en base) |
ifnull ou coalesce sur chacune de tes colonnes!
Marsh Posté le 31-01-2007 à 19:08:59
El_gringo a écrit : le problème c'est que dès qu'il y a un champ NULL, le total est NULL. J'éspérais que ce cast transformerait les NULL en 0. Apparement c'est pas le cas. vous voyez comment je pourrais faire ? (sachant que je dois garder ces NULL en base) |
Avec SQL Server 2005, il y a une option afin d'indiquer comment doivent se comporter les calculs avec NULL.
Peut-être existe-t-il avec MySQL. Il y a de grandes chances.
Sinon, ifnull() est une solution plus propre car explicite, et évite de modifier le comportement du SGBD de façon globale.
Marsh Posté le 31-01-2007 à 20:54:20
El_gringo a écrit : J'ai peut être eu tord, mais là, très franchement, j'en suis plus au moment ou je vais refondre tout mon MCD. C'est un petit extra que je fais bénévolement pour une asso. Là, je cherche à faire un truc stable et fonctionnel rapidement. |
Si tu as MySQL 5, alors tu peux faire très simplement ceci, en reprenant la doc que j'ai écrit :
http://forum.hardware.fr/forum2.ph [...] 0#t1447148
|
Et ça marche :
|
Résultat :
|
=> Voilà. Simple comme choux, et maintenant, tu as une nouvelle structure "propre" et 100% compatible avec l'ancien modèle...
Marsh Posté le 01-02-2007 à 11:43:44
rufo a écrit : Si t'es prêt à refondre ton appli après, pourquoi pas le faire maintenant? Avec ton MCD, tu risques de perdre plein de temps à chaque fois que tu vas vouloir extraire telle ou telle info, alors qu'avec un modèle propre, ça te prendrait 2 mins |
Je peux difficilement le faire maintenant parce qu'on à un 1er impératif de délais pour établir ces stats cette année.
Je peux pas te laisser critiquer MagicBuzz, il a été génial sur ce coup là ! Merci beaucoup MagicBuzz et aux autres aussi. ce topic est une mine d'or pour moi.
Marsh Posté le 01-02-2007 à 11:59:26
El_gringo a écrit : Je peux difficilement le faire maintenant parce qu'on à un 1er impératif de délais pour établir ces stats cette année. |
T'avais compris que c'était une boutade, hein? Il m'a moi-même grandement aidé y'a pas si longtemps sur un pb de BD...
Marsh Posté le 01-02-2007 à 12:56:50
ReplyMarsh Posté le 01-02-2007 à 13:39:38
rufo a écrit : T'avais compris que c'était une boutade, hein? Il m'a moi-même grandement aidé y'a pas si longtemps sur un pb de BD... |
Oui oui j'avais compris. C'en était une aussi quand j'me suis posé comme son défenseur !
Marsh Posté le 01-02-2007 à 18:09:13
MagicBuzz a écrit : ceci dit, j'ai jamais été foutu de résoudre ton problème |
si, en qq sorte. Tu m'avais dit que ce que je voulais faire n'était pas possible avec le MCD que j'avais. C'était donc pas la peine de chercher plus loin
Marsh Posté le 31-01-2007 à 13:57:23
Bonjour tout le monde,
J'ai une table 'PERSONNES', qui se présente comme suit :
+---------------------------------------------------------------------------------------+
| Nom | Sans logement | Isolement social | Sans emploi | Mucovicidose | Pieds plats |
|-------+---------------+------------------+-------------+----------------+-------------|
|Hector | true | true | false | false | true |
|Roger | false | false | true | false | false |
|Simone | false | true | true | true | false |
+---------------------------------------------------------------------------------------+
je cherche à écrire une requête SQL qui me permettrait la chose suivante :
Sélectionner les noms de personnes ayant au moins 3 problèmes connus.
Donc, dans mon exemple, la requête devrait me sortir Simone et Hector, mais pas Roger.
Vous auriez des idées ?
EDIT : cette table n'est qu'un exemple. En réalité je n'ai pas 5 mais une trentaine de 'problèmes connus' (champs booléens), il est donc exclus d'énumérer toutes les combinaisons possibles à grand coups de 'OR' ...
Message édité par El_gringo le 31-01-2007 à 14:11:24