IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Union de table - Sortie bizarre


Sujet :

Requêtes MySQL

  1. #1
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut Union de table - Sortie bizarre
    Bonjour ,

    Un comptage et union porte sur 4 tables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    SELECT COUNT( * ) AS 'Comptage[sup 14°C à 8h]>>Jan:Fev:Mar:Avr'
    FROM mois_1
    WHERE pulse >=14 AND id=17
    UNION
    SELECT COUNT( * )
    FROM mois_2
    WHERE pulse >=14 AND id=17
    UNION
    SELECT COUNT( * )
    FROM mois_3
    WHERE pulse >=14 AND id=17
    UNION
    SELECT COUNT( * )
    FROM mois_4
    WHERE pulse >=14 AND id=17
    Le résultat ne donne que 3 valeurs >> 0 1 15
    Chaque SELECT de table pris un par un donne >> 0 1 1 15

    Pourquoi cette perte de résultat de mysql ??


  2. #2
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 868
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 868
    Points : 16 258
    Points
    16 258
    Par défaut
    Tes colonnes (COUNT(*)) ne sont pas nommées. Essaie de les nommer différemment sur chaque requête.

  3. #3
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut
    ok - mais comment renommer ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    SELECT COUNT( * ) AS 'Jan'
    FROM mois_1
    WHERE pulse >=14
    AND id =17
    UNION
    SELECT COUNT( * ) AS 'Fev'
    FROM mois_2
    WHERE pulse >=14
    AND id =17
    UNION
    SELECT COUNT( * ) AS 'Mar'
    FROM mois_3
    WHERE pulse >=14
    AND id =17
    UNION
    SELECT COUNT( * ) AS 'Avr'
    FROM mois_4
    WHERE pulse >=14
    AND id =17
    Cela donne :

    Jan
    0
    1
    15

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT pulse, COUNT( * ) AS 'Jan'
    Donne 4 résultats :

    pulse Jan
    0.0 0
    14.0 1
    16.1 1
    14.6 15

    Mais il y a encore une coquille - Avec 5 résultats , quand les 2 premiers avec COUNT sont à 0 .
    Il y a 1 sortie pour Jan:Fev :

    pulse Jan:Fev:Mar:Avr:Mai-Valeur>>15°C/8h
    0.0 0
    16.1 1
    16.0 10
    16.7 7

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Bonjour,

    attention la clause UNION de base applique un DISTINCT sur les différente requête tester avec UNION ALL.

    Ensuite pourquoi avoir une table par mois ? ça sent la modélisation un peu foireuse :s
    une réponse vous a permis d'avancer ?

  5. #5
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut
    Ok - merci pour union all

    "une table par mois" , la variation climatique ne suit pas un coup de coeur

  6. #6
    Membre émérite
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    Février 2008
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2008
    Messages : 939
    Points : 2 287
    Points
    2 287
    Par défaut
    Bonjour

    Ce que veut dire "Exia93", c'est qu'une modélisation plus conforme aurait mis en place qu'une seule table avec une colonne "référence du mois" et une colonne "Valeur".

    Pierre

  7. #7
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut
    ok - Mettre tous les mois dans la même table pour ne pas utiliser union all .

    Bien pour du tri sur tous les mois . Mais je ne veux comparer que certains mois entre eux...

  8. #8
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Tu peux alors soit utiliser des vues filtrées par mois, soit mettre la table en autojointures.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  9. #9
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut
    Dans mes tables j'ai trois champs ( ci-joint mois_1) :

    id hr pulse
    1 01_Jan_00_00 9.0
    2 01_Jan_00_30 8.0
    3 01_Jan_01_00 7.7
    4 01_Jan_01_30 7.6
    5 01_Jan_02_00 7.6
    6 01_Jan_02_30 7.4
    7 01_Jan_03_00 7.4
    8 01_Jan_03_30 7.4
    9 01_Jan_04_00 6.9
    10 01_Jan_04_30 6.6
    11 01_Jan_05_00 6.0
    12 01_Jan_05_30 5.9
    13 01_Jan_06_00 5.5

    ...

    Ce que je veux apprendre , c'est du tri multiple dans une table .
    Exemple :
    Calculer tous les gradients entre id=13 et id=1 ( 5.5-9=-3.5)

    Quel tuto pour du tri-calcul-affichage ?


  10. #10
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,

    On doit avoir un problème de références de vocabulaire.

    Pour moi trier c'est "sélectionner", choisir certains parmi beaucoup (genre les cailloux et les lentilles).

    Mais vraiment je ne sais pas de quoi tu parles quand tu dis chercher un
    tuto pour du tri-calcul-affichage
    D'autant que dans l'exemple que tu donnes rien, a priori, ne permet d'établir une relation entre les deux id 13 et 1.
    On aurait donc une requête du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT t1.pulse-t2.pulse AS gradient
    FROM latable AS t1, latable AS t2
    WHERE t1.id=13 AND t2.id=1
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  11. #11
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut
    OK merci - cela ne fonctionne que sur 1 valeur ( la première )

    Dans la table mois_1 , il y a 48 tuples ( id , ht , pulse ) fois (x 31 jours ) = 1488 tuples

    id=1 ( pulse à 00h00min )
    id=13 ( pulse à 06h00min )

    Structure de table :
    id hr pulse
    1 p1
    .. ..
    13 p13
    .. ..
    1 p1
    .. ..
    13 p13

    Je veux que la requête affiche les 31 gradients , grad=p13-p1 ( 31 jours en janvier)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT t1.pulse-t2.pulse AS gradient
    FROM mois_1 AS t1, mois_1 AS t2
    WHERE t1.id=13 AND t2.id=1
    Cette requête affiche 990 gradients.


  12. #12
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Citation Envoyé par bm Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT t1.pulse-t2.pulse AS gradient
    FROM mois_1 AS t1, mois_1 AS t2
    WHERE t1.id=13 AND t2.id=1
    Cette requête affiche 990 gradients
    C'est donc que id n'est pas unique dans la table. Donc il fait un produit cartésien entre tous les t1.id=13 et tous les t2.id=1
    Il faut mettre en relation unique les couples mais par quel moyen ?
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  13. #13
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT t1.pulse-t2.pulse AS gradient
    FROM mois_1 AS t1, mois_1 AS t2
    WHERE t1.id=13 IN (SELECT id FROM mois_1) AND t2.id=1 IN (SELECT id FROM mois_1)
    Mais affichage de 31 gradients "faux"

  14. #14
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Désolé mais cette clause WHERE
    WHERE t1.id=13 IN (SELECT id FROM mois_1) AND t2.id=1 IN (SELECT id FROM mois_1)
    n'a, pour moi, strictement aucun sens.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  15. #15
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut
    ok- sans solution

  16. #16
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    C'est à dire que je pense que le problème est mal posé (ou mal compris, par moi, par exemple) et la table mal conçue.
    La colonne hr, par exemple, gagnerait à être un TIMESTAMP plutôt que ce format hybride, elle semble, en outre être candidate à servir d'identifiant unique dans cette table.

    Ensuite, quel est le besoin exprimé en termes mathématiques rigoureux et précis ?

    Ce que tu appelles gradient semble être l'écart entre deux valeurs de la colonne pulse mais pour quel intervalle de temps ?

    C'est ce dernier point qui devrait permettre de faire la jointure entre deux lignes de la table. Dans l'exemple que tu fournis il semble qu'il y ait une ligne de mesure (pulse) toutes les 1/2 heure (d'où les 48 tuplets, j'imagine) et l'empan de mesure du gradient semble être de 6 heures. Mais faut-il le calculer toutes les 1/2 heures ?

    Mais faut-il calculer le gradient sur la veille quand on démarre avant 6h00 ?

    Exemple : |20140101 05:30|5.9, |20133112 23:30|8.1 => gradient -2.2
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  17. #17
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut
    D'un post précédent :

    Structure de table :
    id , hr , pulse
    1 p1 ----------> correspond à hr=0h ( jour1)
    .. ..
    13 p13 -------> correspond à hr=6h (jour1)
    .. ..
    .. ..
    1 p1 ----------> correspond à hr=0h ( jour31)
    .. ..
    13 p13 -------> correspond à hr=6h (jour31)

    Je veux que la requête affiche les 31 gradients , grad=p13-p1 ( 31 jours en janvier)
    La table contient tous les horaires des 31 jours .

    1 01_Jan_00_00 9.0
    2 01_Jan_00_30 8.0
    3 01_Jan_01_00 7.7
    4 01_Jan_01_30 7.6

    hr : 01_Jan_00_00 est un bloc varchar et dans ma structure, chaque jour est une table

    1_1_2014_pulse ( table du 1er janvier 2014)
    1_2_2014_pulse
    1_3_2014_pulse

    Une view/table du mois est une union de tous les jours.
    Si il faut créer une table spéciale pour ce gradient, je peux reformater en partant des tables jours qui est la plus petite structure commune.

    Le reste de l'application fonctionne est peut continuer .

    Il y a suffisamment de jours différents pour ne pas calculer un gradient sur 2 , 3 .. 10 jours différents

    Les gradients après tracé d'une courbe , révèlent une tendance croissante ou décroissante

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Union et tables à champs identiques
    Par bastien dans le forum Requêtes
    Réponses: 4
    Dernier message: 04/07/2008, 21h55
  2. [XHTML] Table - espace bizarre sous ie
    Par frmaniako dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 20/06/2008, 20h36
  3. Union de tables
    Par abdelghani_k dans le forum Langage SQL
    Réponses: 1
    Dernier message: 27/05/2007, 17h08
  4. [Access-VBA] Requête UNION avec tables liées
    Par adriano057 dans le forum Access
    Réponses: 4
    Dernier message: 28/07/2006, 12h11
  5. [Oracle] Requête sur 3 tables, sortie fichier
    Par Bast92 dans le forum Langage SQL
    Réponses: 20
    Dernier message: 18/04/2006, 15h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo