|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Nouveau Membre du Club
![]() Étudiant Inscription : janvier 2008 Messages : 128 ![]() |
Bonjour à tous,
Je me permets de venir parler d'un petit problème existentiel. Je cherche à dénombrer des éléments suivant une date bien précise (paramètre) et suivant la valeur d'une propriété particulière (fixée). Ça permet de répondre à la question "Combien y-en avait-il possédant tel ou tel statut à telle ou telle date?". La requête ne concerne qu'une seule table qui possède les champs suivant : -id : Identifiant de l'enregistrement (auto_increment, PRIMARY INDEX) -create_time (VARCHAR(30)) : Date de création de l'enregistrement sous la forme d'un timestamp UNIX. -remove_time (VARCHAR(30)) : Date de suppression du jeu de données sous la forme d'un timestamp UNIX. -status_id (INT) : Le statut de l'enregistrement. N valeurs quelconques (la liste des valeurs possibles peut varier d'un enregistrement à un autre). -TOSTATUS_N_TIME (VARCHAR(30)) : Date de passage à la valeur "N" du champ status_id. Si il y a les 3 valeurs possibles {"1", "2", "3"} pour tel ou tel enregistrement, on utilisera les champs TOSTATUS_1_TIME, TOSTATUS_2_TIME et TOSTATUS_3_TIME. La liste totale des statuts est connue à l'avance mais tous les enregistrements ne sont pas censés utiliser tous les statuts. On est donc capable de déterminer les intervalles pendant lesquels le champ status_id a pris telle ou telle valeur. La difficulté reviens à reconstituer cette valeur puisque status_id contient la valeur correspondant à l'instant où la requête est faite et non à l'instant qui nous intéresse. J'ai tenté de faire l'ébauche d'une requête que voici : Code :
Je précise que je souhaite éviter les solutions du genre "N valeurs -> N requêtes" et que je travaille sous MySQL 5 Est-ce que quelqu'un aurait une idée sur la meilleure manière de procéder. Peut-être que mon modèle de données n'est pas adapté pour cette utilisation mais sa remise en question n'est réellement pas souhaitable Merci par avance, bonne journée. |
||
|
|
00
|
|
|
#2 |
![]() ![]() |
Il manque trop d'information pour qu'on puisse vous répondre, à lire :
http://www.developpez.net/forums/a69...gage-sql-lire/
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#3 |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Il y a au moins une chose à changer dans le modèle, c'est le type de donnée de create_time et remove_time.
Tu ne peux pas stocker un unix timestamp dans un VARCHAR il faut un INT, sinon 01/01/1980 (315554400) sera supérieur au 01/01/2011 (1293861600). Mais pourquoi ne pas utiliser le type timestamp (ou date suivant le SGBD) en base, les opérations de manipulations seront nettement plus simples. |
|
|
10
|
|
|
#4 | ||||||
|
Nouveau Membre du Club
![]() Étudiant Inscription : janvier 2008 Messages : 128 ![]() |
Merci pour vos réponses.
En effet j'avoue avoir oublié des choses. J'ai rajouté le nom de mon SGBDR dans le post initial : MySQL 5 sous un serveur mutualisé chez OVH. Voici une requête qui permettrai de créer une table comme celle que j'évoque : Code :
On peut utiliser le dataset suivant : Code :
Code :
|
||||||
|
|
00
|
|
|
#5 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour
Voici une solution : Code SQL :
Mais votre modélisation est... disons... disgracieuse A première vue, vous devriez avoir une table paramétre, une table statut, et une table d'historique parametre_statut... Comment ferez vous lorsqu'un nouveau statut apparaitera ? vous comptez rajouter une colonne à votre table... et réécrire toutes vos requetes ? |
||
|
|
00
|
|
|
#6 | ||||
|
Nouveau Membre du Club
![]() Étudiant Inscription : janvier 2008 Messages : 128 ![]() |
Bonjour aieeeuuuuu,
Citation:
Mais je ne connais pas à l'avance la liste des statut à cibler. Cela dépend de ce qu'il y a effectivement dans la table. Par conséquent je comptais plus sur le GROUP BY pour me tirer d'affaire quant à cette liste. Citation:
Je ne voulais pas alourdir mon explication avec des clauses relationnelles mais peut-être que cela aidera finalement à trouver une solution plus abordable. Les "champs" TOSTATUS_N_TIME sont dans une table annexe (en réalité des lignes de paires clé/valeur) et reliée à la table principale par une table annexe à deux colonnes faisant référence à la fois à la table principale et à la table contenant TOSTATUS_N_TIME. On appelle ca une CIF je crois. |
||||
|
|
00
|
|
|
#7 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Ca change tout !
Et si j'ai a peu près compris votre modélisation (qui me semble finalement beaucoup moins disgracieuse (Si j'ai bien compris, le N de TOSTATUS_N_TIME est la clé dans vos "paires clé/valeur" ??) Donnez-nous votre vrai modèle, on pourra peut-être vous aider ! |
|
|
00
|
|
|
#8 | |||
|
Nouveau Membre du Club
![]() Étudiant Inscription : janvier 2008 Messages : 128 ![]() |
Bonjour,
Très bien, j'ai surement fait une erreur en voulant simplifier le topic, ça a surement plus compliqué les choses que ça ne les a simplifiée en réalité Le modèle actuel est celui-ci. J'espère que c'est compréhensible et j'ai repris le jeu de données que j'ai donné au dessus. ![]() Voici les requêtes pour créer les tables, le résultat attendu est toujours le même que précédemment. Code SQL :
Citation:
Là mon exemple est volontairement orienté sur le cas qui nous intéresse. Les noms des clés peuvent être divers et variés sans concerner forcément le changement de statut. Merci pour votre aide. |
|||
|
|
00
|
|
|
#9 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Ok, c'est plus clair comme ça !
Donc, en supposant qu'un "système" ne puisse pas changer de statut deux fois à la même seconde : que donne ceci ? Code SQL :
|
||
|
|
10
|
|
|
#10 | ||
|
Nouveau Membre du Club
![]() Étudiant Inscription : janvier 2008 Messages : 128 ![]() |
Citation:
Citation:
Et même la première partie me chiffonne. Le "WHERE TAGS.value < 1223549893" serait valable si il n'y avait que des timestamps dans TAGS.value. Ce n'est pas le cas, il y a tout et n'importe quoi dans cette table. Peut-etre qu'en rajoutant "AND TAGS.name LIKE "TOSTATUS_%" ca pourrait être valable mais le résultat est toujours le même : Server shutdown in progress. |
||
|
|
00
|
|
|
#11 | ||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Même problème que précédemment avec un int stocké dans du text.
Peut être : Code :
Mais je ne sais pas si ça supprimera l'erreur qui semble être un crash mysql. En definitive on est passé d'un modèle "trop statique" a un modèle "trop flexible" (Le EAV modèle peut être très galère à utiliser en select). |
||
|
|
00
|
|
|
#12 | |||||
|
Nouveau Membre du Club
![]() Étudiant Inscription : janvier 2008 Messages : 128 ![]() |
Bonjour skuatamad,
Oui, mais je ne peux pas faire autrement. Le contenu de TAGS peut-être vraiment très divers. J'ai par exemple un tag "COMMENT" qui contient les commentaires des utilisateurs et qui peuvent être longs. Citation:
Citation:
Citation:
Mais j'arrive à faire les select que je veux, le plus compliqué étant de restreindre la sélection suivant la valeur de tel ou tel attribut. On y arrive avec une requête imbriquée et une jointure sans problème et ça fonctionne. C'est pour ça que je ne veux vraiment pas faire de remise en question pour ce cas là sachant que plein d'autres choses marchent aujourd'hui avec ce modèle. Merci pour ta réponse. |
|||||
|
|
00
|
|
|
#13 | ||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Citation:
Citation:
Ce modèle a une valeur ajoutée mais comme il n'est pas adapté au fonctionnement relationnel d'un SGBD il faut l'utiliser avec parcimonie, c'est juste un conseil pour la suite. |
||
|
|
10
|
|
|
#14 | |
|
Nouveau Membre du Club
![]() Étudiant Inscription : janvier 2008 Messages : 128 ![]() |
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'int) end < 1223549893 GROUP BY C.record_id ) LastT INNER JOIN ( S' at line 11
Pour info, voici la version précise de MySQL que j'utilise : Version du serveur: 5.0.51a-24+lenny5-log Version du protocole: 10 Citation:
|
|
|
|
00
|
|
|
#15 |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Essaie peut être avec DECIMAL
cast (t.value as DECIMAL) [edit]Pour être cohérent il faudrait peut être aussi caster l'unix timestamp : cast(1223549893 as decimal) |
|
|
00
|
|
|
#16 |
|
Nouveau Membre du Club
![]() Étudiant Inscription : janvier 2008 Messages : 128 ![]() |
Parfait cela marche cette fois en exécutant ce que tu as proposé avec DECIMAL au lieu de int.
Mais la grosse requête me renvoie malheureusement toujours : #1053 - Server shutdown in progress |
|
|
00
|
|
|
#17 |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Zut, bon indépendamment du crash le cast est nécessaire pour les raisons précédemment citées (surtout qu'on est sur une inégalité)
Je n'ai malheureusement pas d'idée là maintenant mais on va continuer à y réfléchir... aieeeuuuuu on a besoin de tes neuronnes Bonne soirée |
|
|
00
|
|
|
#18 | ||
|
Nouveau Membre du Club
![]() Étudiant Inscription : janvier 2008 Messages : 128 ![]() |
Citation:
Citation:
Pour info, cette recherche va me servir pour établir ce genre de graphiques : http://www.infos-reseaux.com/apps/AD...n=monthlyDploy Je surveille des équipements d'accès au réseau pour le grand public qui passent par différentes phases d'activations. En gardant les dates de passage sous la forme d'attributs, on évite de complexifier le stockage avec du versionage des enregistrements par exemple. Mais le tout est de savoir les réutiliser. Ca me permet aussi d'établir le suivi sans avoir inséré les enregistrements dans la base aux dates réelles puisque mon appli n'a pas tourné depuis 1 an. La partie plate sera à terme remplacée par une pente régulière, au rythme des mises en prod effectuées par le FAI. Bonne soirée. |
||
|
|
00
|
|
|
#19 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour,
Il faudrait déjà savoir pourquoi MySQL s'arrete de façon aussi brutale (Logs ?) on va essayer "d'aider" un peu mysql que donne ceci Code SQL :
En plaçant un index sur TAGS(name, value, tag_id) et en vérifiant qu'il est utilisé (avec le like, j'ai un doute sous MySQL) Sinon, as tu possibilité d'ajouter une colonne à TAGS ? tu pourrais spécifier le type contenu dans value, et filtrer dessus, ça serait mieux qu'un LIKE... |
||
|
|
00
|
|
|
#20 |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Je ne pense pas que mysql autorisera la création de l'index combiné à cause des types de données TEXT.
fanfouer, autant pour la colonne value je comprends qu'il faille le type TEXT, mais pour la colonne name (qui représente des noms de colonnes en fait) je pense que VARCHAR(100) sera amplement suffisant, non? Ca permettra au moins de créer l'index sur (name, tag_id). Effectivement il faudrait regarder les logs de mysql. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com