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 :

La colonne ne peut être {null}


Sujet :

Requêtes MySQL

  1. #1
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut La colonne ne peut être {null}
    Bonjour à tous,

    Voilà une requête qui semble être valide à première vue, sauf que MySQL ne semble pas gérer le cas d'exception adéquatement.

    La table de test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TABLE 'SensorsValues' 
    (
       'sv_SensorID' int(10) unsigned NOT NULL,
       'sv_Date' datetime NOT NULL,
       'sv_Value' float DEFAULT NULL,
       PRIMARY KEY ('sv_SensorID', 'sv_Date'),
    ) 
    ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
    La requête posant problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT xDate
    FROM
    (
      SELECT sv_Date AS XDate, MIN(sv_Value) AS xValue
      FROM SensorsValues
      WHERE sv_SensorID = 9999
            AND sv_Date >= '2009-11-29 00:00:00'
            AND sv_Date <= '2009-11-29 03:59:59'
    ) AS XXX
    La sous requête retourne la valeur <NULL> car la table SensorsValues est actuellement vide. Donc la requête parent échoue et j'ai le message d'erreur suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Column 'XDate' cannot be null
    Ce n'est pas normal ? Selon moi, avec un NULL, la requête parent devrait simplement relayer le NULL et voilà ? Mais ce n'est pas le cas.

    Quelqu'un peut m'éclairer ?

    Sinon, j'essais de récupérer la date où la valeur de mon capteur à été la plus petite. Autre façon que j'ai de procéder aurait ressembler à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT sv_Date
    FROM SensorsValues
    WHERE sv_SensorID = 9999
          AND sv_Date >= '2009-11-29 00:00:00'
          AND sv_Date <= '2009-11-29 13:59:59'
    ORDER BY sv_Value, sv_SensorID ASC, sv_Date
    LIMIT 0, 1
    Mais ce n'est pas super optimal comme requête !

    Merci pour votre aide.
    Mieux vaut ne rien savoir que beaucoup savoir à moitié !
    Faite vous en pas avec la vie, personne en est sortie vivant !

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Il y a plusieurs choses que je ne comprends pas bien...
    Qu'est-ce que tu entends par "la table SensorsValues est actuellement NULL" ?
    Sinon, l'utilisation des sous-requêtes dans MySQL est bien moins optimisé qu'une requête ne contenant que des jointures.
    De même, l'utilisation du mot-clef BETWEEN permet également d'optimiser un peu plus la requête (plutôt que 2 inégalités).
    Ainsi, ce que tu cherches à faire pourrait éventuellement s'écrire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT sv1.sv_Date
    FROM SensorsValues sv1
    INNER JOIN SensorsValues sv2 ON sv1.sv_SensorID = sv2.sv_SensorID
    WHERE sv1.sv_SensorID = 9999
    AND sv1.sv_Date BETWEEN '2009-11-29 00:00:00' AND '2009-11-29 13:59:59'
    AND sv2.sv_Date BETWEEN '2009-11-29 00:00:00' AND '2009-11-29 13:59:59'
    GROUP BY sv1.sv_Date, sv1.sv_SensorID
    HAVING sv1.sv_Date = MAX(sv2.sv_Date)
    Je n'ai pas testé la requête, mais ça devrait s'approcher de ce que tu souhaites.

    Bon courage,

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut
    Désolé, j'ai mis à jour le post principale. J'ai aussi ajouter la déclaration de la table de test.

    Ce que je voulais dire par la table est NULL, c'est plutôt : La table est VIDE, aucune ligne y réside.

    La sous-requête ici ne sert qu'à récupérer une date (valeur scalaire). Cette sous-requête n'est pas corrélée, alors elle est d'abord appelé (une seule fois) pour récupérer la date et ensuite, la requête parente re-fait un SELECT sur cette valeur scalaire. À mon avis, c'est assez optimal ?

    Je comprend votre bout de code avec la jointure. Je crois que je pourrais utiliser cette solution...

    Cependant, je ne comprend toujours pas pourquoi MySQL ne gère d'avoir un NULL dans une sous-requête.
    Mieux vaut ne rien savoir que beaucoup savoir à moitié !
    Faite vous en pas avec la vie, personne en est sortie vivant !

  4. #4
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut
    Merci pour votre aide, mais ce n'est pas exactement ce que j'ai besion.

    Dans la table, j'ai 2 sensors 1 et 2. Chacun possède des valeurs basé sur une date.

    J'aimerais trouvé la date/time de la valeur la plus basse du capteur 2 (entre une date précise, disons 2009-01-01 00:00:00 et 2009-01-01 03:59:59).

    Une fois cette date/time trouvé, j'aimerais récupérer la valeur du capteur 1 pour cette date/time.

    Tout ce qui est important c'est la valeur finale.

    Jusqu'ici, j'ai bredouillé la requête suivante (sans savoir si je suis sur le bon chemin). Et je ne sais pas trop comment ou où ajouter le prédicat sur la date.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT p3.sv_Value
    FROM SensorsValues AS p1 
    	 LEFT JOIN SensorsValues AS p2 
    		ON p1.sv_SensorID = p2.sv_SensorID 
    		   AND p1.sv_Value > p2.sv_Value
    	 INNER JOIN SensorsValues AS p3
    		ON p3.sv_SensorID = 2 
    		   AND p1.sv_Date = p3.sv_Date
    WHERE p1.sv_SensorID = 1 AND p2.sv_SensorID IS NULL
    Merci
    Mieux vaut ne rien savoir que beaucoup savoir à moitié !
    Faite vous en pas avec la vie, personne en est sortie vivant !

  5. #5
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut
    J'ai trouvé la solution :0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT p3.sv_Value 
    FROM SensorsValues AS p1
    	 LEFT JOIN SensorsValues AS p2 
    		ON p1.sv_SensorID = p2.sv_SensorID 
    		   AND p1.sv_Value > p2.sv_Value
               AND p2.sv_Date BETWEEN '2009-01-01 00:05:00' AND '2009-01-01 00:10:00'
    	 INNER JOIN SensorsValues AS p3
    		ON p3.sv_SensorID = 2 
    		   AND p1.sv_Date = p3.sv_Date
    WHERE p1.sv_SensorID = 1
    	  AND p1.sv_Date BETWEEN '2009-01-01 00:05:00' AND '2009-01-01 00:10:00'
          AND p2.sv_Date IS NULL
    Merci à tous
    Mieux vaut ne rien savoir que beaucoup savoir à moitié !
    Faite vous en pas avec la vie, personne en est sortie vivant !

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

Discussions similaires

  1. INDEX sur une colonne qui peut être NULL
    Par dorian53 dans le forum Requêtes
    Réponses: 15
    Dernier message: 29/11/2007, 17h13
  2. Many-to-one ne peut être null
    Par minimarch76 dans le forum Hibernate
    Réponses: 2
    Dernier message: 14/09/2007, 11h27
  3. Comment insérer une date qui peut être nulle ?
    Par guidav dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 30/01/2007, 16h18
  4. [Access][SQL] Filtrer un champ text qui peut être NULL
    Par aumax1 dans le forum VBA Access
    Réponses: 1
    Dernier message: 04/04/2006, 08h40

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