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 :

Recuperer informations avec une date passée


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 816
    Points : 49
    Points
    49
    Par défaut Recuperer informations avec une date passée
    Bonjour à tous,

    Je realise pour mon entreprise une BDD pour l'inventaire.

    J'ai créer ma table inventaire avec comme champs:

    id_inventaire
    date_inventaire
    qte_inventaire
    id_matiere

    Et je voudrait savoir sil il est possible de réaliser une requête sql qui permettrait de récupérer la qte_inventaire de la précédente date.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT code_m, nom_m, cond_m, unite_conditionnement, pu_m, qte_inventaire_mat 
    FROM inventaire_mat, matiere  
    INNER JOIN conditionnement ON conditionnement.id_conditionnement=matiere.id_conditionnement  
    INNER JOIN fournisseur ON fournisseur.id_four=matiere.id_four  
    LEFT JOIN matiere_type ON matiere.id_matiere_type=matiere_type.id_matiere_type  
    WHERE matiere.id_matiere_type= '1' AND date_inventaire_mat <=NOW();
    Donc on va chercher les infos qu'on désire et je voudrait récupérer la qte_inventaire de la date précédente pour les affiche après dans une page web.

    inventaire réaliser le 01-02-2008 , 02-03-2008 et nous réalisons l'inventaire du 01-04-2008 , je voudrait qu'il m'affiche seulement les qte pour chaque matière du 02-03-2008

    Est-ce possible? Quelqu'un pourrait-il m'aiguiller?

    Merci d'avance pour votre aide

    guigui69

  2. #2
    Membre confirmé Avatar de nounetmasque
    Inscrit en
    Janvier 2003
    Messages
    494
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 494
    Points : 570
    Points
    570
    Par défaut
    Le plus compliqué dans ton cas est de récupérer l'avant dernière date de ton inventaire. Essaye la requete suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT MIN(date_inventaire) 
    FROM 
     (
      SELECT date_inventaire
      FROM inventaire
      ORDER BY date_inventaire DESC 
      LIMIT 2
     ) as SELECT_DATE
    Ensuite tu injectes cette requete dans la tienne :
    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
     
    SELECT code_m, nom_m, cond_m, unite_conditionnement, 
               pu_m, qte_inventaire_mat 
    FROM inventaire_mat, matiere,
    (SELECT MIN(date_inventaire) 
    FROM 
     (
      SELECT date_inventaire
      FROM inventaire
      ORDER BY date_inventaire DESC 
      LIMIT 2
     ) as SELECT_DATE) as SELECT_DATE_MIN
    INNER JOIN conditionnement ON    conditionnement.id_conditionnement=matiere.id_conditionnement  
    INNER JOIN fournisseur ON fournisseur.id_four=matiere.id_four  
    LEFT JOIN matiere_type ON matiere.id_matiere_type=matiere_type.id_matiere_type  
    WHERE matiere.id_matiere_type= '1' 
    AND date_inventaire_mat = SELECT_DATE_MIN. date_inventaire;
    Ca va pas marcher du premier coup mais je pense que cette piste est a exploiter.
    "Dieu reste muet, si seulement nous pouvions convaincre l'être humain d'en faire autant."

  3. #3
    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
    Citation Envoyé par nounetmasque Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT MIN(date_inventaire) 
    FROM 
     (
      SELECT date_inventaire
      FROM inventaire
      ORDER BY date_inventaire DESC 
      LIMIT 2
     ) as SELECT_DATE
    Plutôt comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT date_inventaire
    FROM inventaire
    ORDER BY date_inventaire DESC
    LIMIT 1, 1
    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

  4. #4
    Membre confirmé Avatar de nounetmasque
    Inscrit en
    Janvier 2003
    Messages
    494
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 494
    Points : 570
    Points
    570
    Par défaut
    Citation Envoyé par ced Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT date_inventaire
    FROM inventaire
    ORDER BY date_inventaire DESC
    LIMIT 1, 1
    ced
    Avec cette méthode, on va seulement récupérer la plus grande date dans la table non ?
    Or, et si j'ai bien compris le sujet, dans sa table il y a les dates du 02-03-2008 et du 01-04-2008 et on doit récupérer la date 02-03-2008.
    "Dieu reste muet, si seulement nous pouvions convaincre l'être humain d'en faire autant."

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 816
    Points : 49
    Points
    49
    Par défaut
    Merci je regarde ca et je reply . Ce que je cherche a récupérer a la date précédent (passé).

    Merci pour votre aide

    guigui69

  6. #6
    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
    Citation Envoyé par nounetmasque Voir le message
    Avec cette méthode, on va seulement récupérer la plus grande date dans la table non ?
    Or, et si j'ai bien compris le sujet, dans sa table il y a les dates du 02-03-2008 et du 01-04-2008 et on doit récupérer la date 02-03-2008.
    Justement... D'abord, si il y a plusieurs produits dans la table inventaire, la même date d'inventaire peut être répétée plusieurs fois. D'où le DISTINCT .
    Ensuite, pour ne ramener que l'avant-dernier jour, c'est-à-dire la deuxième ligne de la requête, c'est bien LIMIT 1,1. C'est la subtilité de LIMIT : il commence son index de lignes à 0. Donc la deuxième ligne est numérotée 1 et je ne ramène qu'une seule ligne .

    Voilà le pourquoi de ma requête .

    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

  7. #7
    Membre confirmé Avatar de nounetmasque
    Inscrit en
    Janvier 2003
    Messages
    494
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 494
    Points : 570
    Points
    570
    Par défaut
    Citation Envoyé par ced Voir le message
    C'est la subtilité de LIMIT : il commence son index de lignes à 0.
    Merci pour cette explication, je comprends mieux
    "Dieu reste muet, si seulement nous pouvions convaincre l'être humain d'en faire autant."

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 816
    Points : 49
    Points
    49
    Par défaut
    Merci pour vos réponses

    donc il faudrait mieux que je met comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT DISTINCT date_inventaire_mat FROM inventaire_mat ORDER BY date_inventaire_mat ASC LIMIT 1, 1;
    car avec DESC j'obient ma premier date (01/02/3008) alors que ASC j'ai (21/03/2008)

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 816
    Points : 49
    Points
    49
    Par défaut
    Voici ma requete, mais elle ne fonctionne pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT code_m, nom_m, nom_four, cond_m, unite_conditionnement, qte_inventaire_mat  
    FROM inventaire_mat,
    (SELECT MIN(date_inventaire_mat)  FROM  (SELECT DISTINCT date_inventaire_mat FROM inventaire_mat ORDER BY date_inventaire_mat ASC LIMIT 1, 1;)) AS SELECT_DATE_MIN
    LEFT JOIN matiere ON matiere.code_m=inventaire_mat.code_matiere  
    RIGHT JOIN fournisseur ON matiere.id_four=fournisseur.id_four   
    RIGHT JOIN conditionnement ON conditionnement.id_conditionnement=matiere.id_conditionnement  
    WHERE matiere.id_matiere_type= '1' AND date_inventaire_mat = SELECT_DATE_MIN.date_inventaire_mat;
    Ou est mon erreur? car la j'essaie de trouver le problème mais je n' y arrive pas

    merci d'avance pour votre aide

    guigui69

  10. #10
    Membre confirmé Avatar de nounetmasque
    Inscrit en
    Janvier 2003
    Messages
    494
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 494
    Points : 570
    Points
    570
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT code_m, nom_m, nom_four, cond_m, unite_conditionnement, qte_inventaire_mat  
    FROM inventaire_mat,
    (SELECT DISTINCT date_inventaire_mat FROM inventaire_mat ORDER BY date_inventaire_mat DESC LIMIT 1, 1) AS SELECT_DATE_MIN
    LEFT JOIN matiere ON matiere.code_m=inventaire_mat.code_matiere  
    RIGHT JOIN fournisseur ON matiere.id_four=fournisseur.id_four   
    RIGHT JOIN conditionnement ON conditionnement.id_conditionnement=matiere.id_conditionnement  
    WHERE matiere.id_matiere_type= '1' AND date_inventaire_mat = SELECT_DATE_MIN.date_inventaire_mat;
    "Dieu reste muet, si seulement nous pouvions convaincre l'être humain d'en faire autant."

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 816
    Points : 49
    Points
    49
    Par défaut
    Merci pour ton aide,

    J'ai regarder le code mais il me sort ceci:

    ERROR 1052 (23000): Column 'date_inventaire_mat' in where clause is ambiguous

    J'ai essayer de rajouter inventaire_mat.date_inventaire_mat mais ca ne change rien il me sort toujours cette erreur

    Merci d'avance pour votre aide

    guigui69

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 816
    Points : 49
    Points
    49
    Par défaut
    Re bonjour a tous ,

    j'aurai vraiment besoin d'aide car ma requete ne fonctionne pas correctement soit elle me sort une erreur soit j'ai plus de 4000 réponses alors que normalement je devrait en avoir que 61.

    Je suis repartit de cette requete:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT qte_inventaire_mat
    FROM inventaire_mat, (
     
    SELECT DISTINCT date_inventaire_mat
    FROM inventaire_mat
    ORDER BY date_inventaire_mat ASC
    LIMIT 1 , 1
    ) AS test
    WHERE inventaire_mat.date_inventaire_mat = test.date_inventaire_mat
    Aprs j'ai rajouté ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT qte_inventaire_mat
    FROM inventaire_mat, (
     
    SELECT DISTINCT date_inventaire_mat
    FROM inventaire_mat
    ORDER BY date_inventaire_mat ASC
    LIMIT 1 , 1
    ) AS test
    LEFT JOIN matiere ON matiere.code_m = inventaire_mat.code_m
    WHERE id_matiere_type = '1'
    AND inventaire_mat.date_inventaire_mat = test.date_inventaire_mat
    il me ressort ceci:
    #1054 - Unknown column 'inventaire_mat.code_m' in 'on clause'

    Alors que ma table inventaire_mat dispose bien d'un champ code_m qui est le lien avec la table matiere.

    Si quelqu'un pourrait m'aider je suis preneur

    guigui69

  13. #13
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Personnllement, comme je travaille sur une application multi bases, j'ai pris l'habitude de nommer complètement les éléments interrogés et d'utiliser des alias pour les tables : [NomBase].[NomTable].[NomColonne]
    Comme tu es peut-être sur une seule base, tu peux te passer du [NomBase] et dans ton cas ça donnerait le code ci-dessous. Peut-être que ça éviterait à MySQL de se poser des questions inutiles.
    Ensuite, je mettrais le LEFT JOIN immédiatement après la table source de la jointure.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT i.qte_inventaire_mat
    FROM inventaire_mat i
    LEFT JOIN matiere m ON m.code_m = i.code_m
    , (
     
    SELECT DISTINCT i2.date_inventaire_mat
    FROM inventaire_mat i2
    ORDER BY i2.date_inventaire_mat ASC
    LIMIT 1 , 1
    ) test
    WHERE m.id_matiere_type = '1'
    AND i.date_inventaire_mat = test.date_inventaire_mat
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  14. #14
    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
    Au moins un des problèmes doit venir du mélange des deux syntaxes de jointures (avec virgule et avec LEFT JOIN).
    Privilégie la seconde écriture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT qte_inventaire_mat
    FROM inventaire_mat 
    INNER JOIN (
      SELECT DISTINCT date_inventaire_mat
      FROM inventaire_mat
      ORDER BY date_inventaire_mat ASC
      LIMIT 1 , 1
    ) AS test ON inventaire_mat.date_inventaire_mat = test.date_inventaire_mat
    LEFT JOIN matiere ON matiere.code_m = inventaire_mat.code_m
    WHERE id_matiere_type = '1'
    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

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 816
    Points : 49
    Points
    49
    Par défaut
    Merci pour vos réponses, mais je vient de rendre compte que cela allait me poser de problème dans le fonctionnement.


    J'ai donc créer 2 champs en plus mois et année dans ma table.

    Je voudrait toujours récupérer les information sur ma matiere ainsi que les quantité du mois précédent par rapport à mes 2 nouveau champs.

    Mais le soucis c'est que chaque mois on peut rajouter un nouveau produit (et donc celui ci n'a encore aucune donnée dans l'inventaire)

    table inventaire_mat

    id_inventaire_mat
    date_inventaire_mat
    qte_inventaire_mat
    code_m (cl de la table matiere)
    mois_inventaire
    annee_inventaire

    table matiere

    code_m
    nom_m
    id_four
    cond_m
    pu_m
    id_matiere_type


    Voici la requete que j'ai réalisé:
    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
     
     
     SELECT matiere.code_m, nom_m, nom_four, cond_m, unite_conditionnement, (
     
    SELECT qte_inventaire_mat
    FROM inventaire_mat
    LEFT JOIN matiere ON matiere.code_m = inventaire_mat.code_m
    WHERE mois_inventaire =2
    AND annee_inventaire =2008
    ) AS qte1
    FROM inventaire_mat
    LEFT JOIN matiere ON matiere.code_m = inventaire_mat.code_m
    INNER JOIN fournisseur ON matiere.id_four = fournisseur.id_four
    INNER JOIN conditionnement ON conditionnement.id_conditionnement = matiere.id_conditionnement
    WHERE id_matiere_type = '1'
    Je voudrait que la requête m'affiche les informations du produit, avec la quantité du mois précédent qui lui correspond et si jamais dans le cas d'un nouveau produit (donc rien dans l'inventaire) cela retour null dans le champ quantité.

    Qu'est qui cloche dans ma requête,? mes jointures?

    Merci pour l'aide que vous m'avez apporter

    guigui69

  16. #16
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FROM inventaire_mat
    LEFT JOIN matiere ON matiere.code_m = inventaire_mat.code_m
    Dans ce cas tu prends toutes les lignes de la table de gauche (inventaire_mat).

    Ce que tu veux en fait c'est avoir toutes les lignes de la table 'matiere', même si elles n'ont pas encore de quantité dans l'inventaire. Donc il faut faire au contraire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FROM inventaire_mat
    RIGHT JOIN matiere ON matiere.code_m = inventaire_mat.code_m
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 816
    Points : 49
    Points
    49
    Par défaut
    Merci pour ta réponse.

    J'ai essayé comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     SELECT matiere.code_m, nom_m, nom_four, cond_m, unite_conditionnement, (
     
    SELECT qte_inventaire_mat
    FROM inventaire_mat
    RIGHT JOIN matiere ON matiere.code_m = inventaire_mat.code_m
    WHERE mois_inventaire =2
    AND annee_inventaire =2008
    ) AS qte1
    FROM inventaire_mat
    LEFT JOIN matiere ON matiere.code_m = inventaire_mat.code_m
    INNER JOIN fournisseur ON matiere.id_four = fournisseur.id_four
    INNER JOIN conditionnement ON conditionnement.id_conditionnement = matiere.id_conditionnement
    WHERE id_matiere_type = '1'
    Mais ca ne fonctionne pas
    (#1242 - Subquery returns more than 1 row )


    Quel erreurs j'ai commise dans cette requette? qu'est que j'ai mal compris?

    Merci de ton aide

    guigui69

  18. #18
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Effectivement, tu cherches à mettre dans une colonne le résultat d'une requête qui donne plusieurs enregistrements.

    Essaie plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT matiere.code_m, nom_m, nom_four, cond_m, unite_conditionnement, qte_inventaire_mat
    FROM matiere
    LEFT JOIN inventaire_mat ON matiere.code_m = inventaire_mat.code_m
    INNER JOIN fournisseur ON matiere.id_four = fournisseur.id_four
    INNER JOIN conditionnement ON conditionnement.id_conditionnement = matiere.id_conditionnement
    WHERE id_matiere_type = '1' AND mois_inventaire =2 AND annee_inventaire =2008
    En plus c'est plus simple si ça marche.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 816
    Points : 49
    Points
    49
    Par défaut
    Merci pour ton aide mais j'ai toujour un probleme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT matiere.code_m, nom_m, nom_four, cond_m, unite_conditionnement, qte_inventaire_mat
    FROM matiere
    LEFT JOIN inventaire_mat ON matiere.code_m = inventaire_mat.code_m
    INNER JOIN fournisseur ON matiere.id_four = fournisseur.id_four
    INNER JOIN conditionnement ON conditionnement.id_conditionnement = matiere.id_conditionnement
    WHERE id_matiere_type = '1' AND mois_inventaire =2 AND annee_inventaire =2008
    Avec ce code je n'ai pas erreurs le problème mais si par exemple je remplace le 1 de id_matiere_premiere par un 2 cela me ressort pas d'enregistrement.

    J'ai essayer avec ce code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT matiere.code_m, nom_m, nom_four, cond_m, unite_conditionnement, qte_inventaire_mat
    FROM matiere
    LEFT JOIN inventaire_mat ON matiere.code_m = inventaire_mat.code_m
    INNER JOIN fournisseur ON matiere.id_four = fournisseur.id_four
    INNER JOIN conditionnement ON conditionnement.id_conditionnement = matiere.id_conditionnement
    WHERE id_matiere_type = '1'
    AND mois_inventaire =2
    OR mois_inventaire IS NULL
    AND annee_inventaire =2008
    OR annee_inventaire IS NULL
    Il me ressort tout les enregistrements avec l'id_inventaire_type à 1 et 2 alors que je veut seulement le id_matiere_type 1.


    Quel sont mes erreurs dans cette requête (j'ai lu l'article SQL sur les jointures donc je pensais avoir bon, mais non )

    Merci d'avance pour votre aide

    guigui69

  20. #20
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par guigui69 Voir le message
    Avec ce code je n'ai pas erreurs le problème mais si par exemple je remplace le 1 de id_matiere_premiere par un 2 cela me ressort pas d'enregistrement.
    Y a t-il dans ta table des enregistrements avec le l'id_matiere = '2' ?
    Si ça fonctionne avec 1 et pas avec 2 c'est que la requête fonctionne mais qu'il n'y a pas de résultat dans la base correspondant aux critères.

    J'ai essayer avec ce code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT matiere.code_m, nom_m, nom_four, cond_m, unite_conditionnement, qte_inventaire_mat
    FROM matiere
    LEFT JOIN inventaire_mat ON matiere.code_m = inventaire_mat.code_m
    INNER JOIN fournisseur ON matiere.id_four = fournisseur.id_four
    INNER JOIN conditionnement ON conditionnement.id_conditionnement = matiere.id_conditionnement
    WHERE id_matiere_type = '1'
    AND mois_inventaire =2
    OR mois_inventaire IS NULL
    AND annee_inventaire =2008
    OR annee_inventaire IS NULL
    Il me ressort tout les enregistrements avec l'id_inventaire_type à 1 et 2 alors que je veut seulement le id_matiere_type 1.
    id_inventaire_type ? Il ne figure pas dans la requête !
    Si tu ne parles ci-dessus que de id_matiere_type, c'est peut-être un probème de parenthèses. Le AND est prioritaire sur le OR. Tel que c'est écrit, ça équivaut à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    WHERE (id_matiere_type = '1'
    AND mois_inventaire =2)
    OR (mois_inventaire IS NULL
    AND annee_inventaire =2008)
    OR (annee_inventaire IS NULL)
    Le dernier OR notamment va te retourner tous les enregistrements.

    A priori, ce n'est pas un problème de jointure mais la clause WHERE qui est mal écrite.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. Problème avec une date !!
    Par pilz dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 04/04/2006, 11h35
  2. probleme avec une date
    Par somatino dans le forum Requêtes
    Réponses: 3
    Dernier message: 29/03/2006, 15h56
  3. [JDBC] Requête avec une date sous la forme dd/MM/yyyy
    Par sylviefrfr dans le forum JDBC
    Réponses: 6
    Dernier message: 12/11/2005, 09h35
  4. Réponses: 2
    Dernier message: 16/08/2005, 15h33
  5. probléme avec une date/string dans un CommandText
    Par critok dans le forum Bases de données
    Réponses: 5
    Dernier message: 09/02/2005, 15h30

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