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 :

problème de logique


Sujet :

Requêtes MySQL

  1. #1
    Membre averti Avatar de PAYASS59
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2005
    Messages : 755
    Points : 324
    Points
    324
    Par défaut problème de logique
    Bonjour,

    voilà j'ai un souci avec le NOT IN :

    explication:

    une table materiel
    id_materiel
    nom_materiel

    les valeurs de id_materiel sont :1,2,3,4,5,6,7,8,9

    une table demande_materiel
    id_demande
    ....
    id_materiel

    dans cette table je n'ai que la valeur 2 et 9 de présentes dans le champ id_materiel


    si je fais :

    Code :
    select id_materiel from materiel where id_materiel IN (select id_materiel from demande_materiel)


    la requete me retourne 2 et 9


    donc si je fais

    Code :
    select id_materiel from materiel where id_materiel NOT IN (select id_materiel from demande_materiel)


    je m'attends à avoir 1,3,4,5,6,7,8 (l'inverse)

    mais cette requete ne me retourne rien et je comprends pas pourquoi alors si quelqu'un a une idée je suis preneur
    merci d'avance

  2. #2
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716

  3. #3
    Membre averti Avatar de PAYASS59
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2005
    Messages : 755
    Points : 324
    Points
    324
    Par défaut
    le double post ne concerne pas ce sujet !!!

    je veux bien continuer de poser mes questions dans le bon post mais j'ai l'impression que bcp de post sont morst avant d'arriver à terme

  4. #4
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par weedman59
    je veux bien continuer de poser mes questions dans le bon post mais j'ai l'impression que bcp de post sont morst avant d'arriver à terme
    C'est normal! En faisant une petite recherche, j'ai vu que tu avais lancé 3 discussions sur ton problème de demande_materiel avec toujours la même réponse: "ça marche pas...". Dans ces discussions les requêtes m'ont l'air tout à fait correctes, alors donne des exemples du contenu de tes tables, qu'on puisse comprendre ce qui cloche !

  5. #5
    Membre averti Avatar de PAYASS59
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2005
    Messages : 755
    Points : 324
    Points
    324
    Par défaut
    une discussion ne concernait pas le meme pb (cela concernait un having)

    le probleme cest que j'ai du mal a être plus clair car je comprends pas ce qui se passe.

    je cherche à afficher les valeurs de mon champ id_materiel présent dans la table materiel mais pas dans la table demande_materiel

  6. #6
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par weedman59
    une discussion ne concernait pas le meme pb (cela concernait un having)
    Un HAVING COUNT(...)=0, donc si, c'est bien le même problème !


    Citation Envoyé par weedman59
    le probleme cest que j'ai du mal a être plus clair car je comprends pas ce qui se passe.
    Nous non plus on ne comprend pas ce qu'il se passe parce qu'on est sûr que les requêtes sont correctes. Donne le contenu de tes tables et le résultat obtenu, qu'on essaye de comprendre...

  7. #7
    Membre averti Avatar de PAYASS59
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2005
    Messages : 755
    Points : 324
    Points
    324
    Par défaut
    si tu veux tester je joints le code

    table materiel:
    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
    20
    21
    22
     
    Structure de la table `materiel`
    -- 
    CREATE TABLE `materiel` (
      `id_materiel` int(20) NOT NULL auto_increment,
      `nom_materiel` varchar(100) NOT NULL default '0',
      `id_type_materiel` int(20) NOT NULL default '0',
      `statut_materiel` int(11) NOT NULL default '0',
      PRIMARY KEY  (`id_materiel`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
    -- 
    -- Contenu de la table `materiel`
    -- 
    INSERT INTO `materiel` (`id_materiel`, `nom_materiel`, `id_type_materiel`, `statut_materiel`) VALUES (1, 'ORDINATEUR PORTABLE', 24, 1);
    INSERT INTO `materiel` (`id_materiel`, `nom_materiel`, `id_type_materiel`, `statut_materiel`) VALUES (2, 'VIDÉOPROJECTEUR 1', 25, 1);
    INSERT INTO `materiel` (`id_materiel`, `nom_materiel`, `id_type_materiel`, `statut_materiel`) VALUES (3, 'VIDÉOPROJECTEUR 2', 25, 1);
    INSERT INTO `materiel` (`id_materiel`, `nom_materiel`, `id_type_materiel`, `statut_materiel`) VALUES (4, 'APPAREIL PHOTO COMPACT', 26, 1);
    INSERT INTO `materiel` (`id_materiel`, `nom_materiel`, `id_type_materiel`, `statut_materiel`) VALUES (5, 'RÉTROPROJECTEUR', 27, 1);
    INSERT INTO `materiel` (`id_materiel`, `nom_materiel`, `id_type_materiel`, `statut_materiel`) VALUES (6, 'COMBI-MAGNÉTOSCOPE', 29, 1);
    INSERT INTO `materiel` (`id_materiel`, `nom_materiel`, `id_type_materiel`, `statut_materiel`) VALUES (7, 'GRILLES', 30, 1);
    INSERT INTO `materiel` (`id_materiel`, `nom_materiel`, `id_type_materiel`, `statut_materiel`) VALUES (8, 'PANNEAUX PHOTOS', 31, 1);
    INSERT INTO `materiel` (`id_materiel`, `nom_materiel`, `id_type_materiel`, `statut_materiel`) VALUES (9, 'CAMESCOPE', 32, 1);

    table demande_materiel
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    CREATE TABLE `demande_materiel` (
      `id_demande_materiel` int(11) NOT NULL auto_increment,
      `id_demandeur_materiel` int(11) NOT NULL default '0',
      `id_beneficiaire_materiel` int(11) NOT NULL default '0',
      `date_demande_materiel` date NOT NULL default '0000-00-00',
      `date_statut_materiel` date default NULL,
      `statut_materiel` int(11) default NULL,
      `date_solde_materiel` date default NULL,
      `objet_demande` longtext NOT NULL,
      `lieu_utilisation` longtext NOT NULL,
      `commentaire` longtext,
      `id_type_materiel` varchar(11) NOT NULL default '0',
      `id_materiel` int(11) default NULL,
      `date_debut_reservation` date NOT NULL default '0000-00-00',
      `creneau_debut_reservation` int(11) NOT NULL default '0',
      `date_fin_reservation` date NOT NULL default '0000-00-00',
      `creneau_fin_reservation` int(11) NOT NULL default '0',
      `date_debut_demandeur` date NOT NULL default '0000-00-00',
      `heure_debut_demandeur` time NOT NULL default '00:00:00',
      `date_fin_demandeur` date NOT NULL default '0000-00-00',
      `heure_fin_demandeur` time NOT NULL default '00:00:00',
      `id_realisateur_materiel` int(11) default NULL,
      `retour_materiel` tinyint(4) NOT NULL default '0',
      PRIMARY KEY  (`id_demande_materiel`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
    -- 
    -- Contenu de la table `demande_materiel`
    -- 
    INSERT INTO `demande_materiel` (`id_demande_materiel`, `id_demandeur_materiel`, `id_beneficiaire_materiel`, `date_demande_materiel`, `date_statut_materiel`, `statut_materiel`, `date_solde_materiel`, `objet_demande`, `lieu_utilisation`, `commentaire`, `id_type_materiel`, `id_materiel`, `date_debut_reservation`, `creneau_debut_reservation`, `date_fin_reservation`, `creneau_fin_reservation`, `date_debut_demandeur`, `heure_debut_demandeur`, `date_fin_demandeur`, `heure_fin_demandeur`, `id_realisateur_materiel`, `retour_materiel`) VALUES (1, 51538488, 51538488, '2006-04-26', '2006-04-26', 2, NULL, 'grosse présentation...ça va être chaud', 'le stade de france', '', '25', 2, '2006-05-12', 2, '2006-05-16', 1, '2006-05-15', '08:00:00', '2006-05-15', '18:00:00', NULL, 0);
    INSERT INTO `demande_materiel` (`id_demande_materiel`, `id_demandeur_materiel`, `id_beneficiaire_materiel`, `date_demande_materiel`, `date_statut_materiel`, `statut_materiel`, `date_solde_materiel`, `objet_demande`, `lieu_utilisation`, `commentaire`, `id_type_materiel`, `id_materiel`, `date_debut_reservation`, `creneau_debut_reservation`, `date_fin_reservation`, `creneau_fin_reservation`, `date_debut_demandeur`, `heure_debut_demandeur`, `date_fin_demandeur`, `heure_fin_demandeur`, `id_realisateur_materiel`, `retour_materiel`) VALUES (2, 51538488, 51538488, '2006-04-26', '2006-04-27', 1, '2006-04-27', 'vggggg', 'fggggggggggg', '', '25', 2, '2006-05-12', 2, '2006-05-12', 2, '2006-05-12', '15:00:00', '2006-05-12', '17:00:00', NULL, 0);
    INSERT INTO `demande_materiel` (`id_demande_materiel`, `id_demandeur_materiel`, `id_beneficiaire_materiel`, `date_demande_materiel`, `date_statut_materiel`, `statut_materiel`, `date_solde_materiel`, `objet_demande`, `lieu_utilisation`, `commentaire`, `id_type_materiel`, `id_materiel`, `date_debut_reservation`, `creneau_debut_reservation`, `date_fin_reservation`, `creneau_fin_reservation`, `date_debut_demandeur`, `heure_debut_demandeur`, `date_fin_demandeur`, `heure_fin_demandeur`, `id_realisateur_materiel`, `retour_materiel`) VALUES (3, 51524494, 51524494, '2006-04-27', NULL, NULL, NULL, 'ffffffff', 'ffffffffffffffffffff', 'fffffff', '26', NULL, '2006-04-28', 1, '2006-05-01', 1, '2006-04-29', '10:10:00', '2006-04-30', '10:00:00', NULL, 0);
    INSERT INTO `demande_materiel` (`id_demande_materiel`, `id_demandeur_materiel`, `id_beneficiaire_materiel`, `date_demande_materiel`, `date_statut_materiel`, `statut_materiel`, `date_solde_materiel`, `objet_demande`, `lieu_utilisation`, `commentaire`, `id_type_materiel`, `id_materiel`, `date_debut_reservation`, `creneau_debut_reservation`, `date_fin_reservation`, `creneau_fin_reservation`, `date_debut_demandeur`, `heure_debut_demandeur`, `date_fin_demandeur`, `heure_fin_demandeur`, `id_realisateur_materiel`, `retour_materiel`) VALUES (4, 51538488, 51538488, '2006-04-27', '2006-04-27', 2, NULL, 'bv', 'vchvc', 'vcbcvb', '32', 9, '2006-04-28', 1, '2006-05-01', 1, '2006-04-30', '10:00:00', '2006-04-30', '11:00:00', NULL, 0);

  8. #8
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    D'après ce que je vois, il n'y a pas de demande matériel pour le 2006-04-04, or dans l'autre sujet tu demandais un test pour cette date précise et tu te plaignais que ça te retourne que tous les matériels étaient disponibles à ce moment là (ce qui es le cas!).

    Tu es sûr que ton erreur ne vient pas de là?

  9. #9
    Membre averti Avatar de PAYASS59
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2005
    Messages : 755
    Points : 324
    Points
    324
    Par défaut
    je ne parle pazs de date


    si je fais :

    Code :
    select id_materiel from materiel where id_materiel IN (select id_materiel from demande_materiel)


    la requete me retourne 2 et 9


    donc si je fais

    Code :
    select id_materiel from materiel where id_materiel NOT IN (select id_materiel from demande_materiel)


    je m'attends à avoir 1,3,4,5,6,7,8 (l'inverse)

  10. #10
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    En effet, le NOT IN (tel que tu l'as écrit) ne marche pas.

    Par contre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT materiel.id_materiel
     
    FROM materiel
     
    LEFT JOIN demande_materiel
    ON materiel.id_materiel = demande_materiel.id_materiel
     
    WHERE demande_materiel.id_materiel IS NULL
    marche très bien !


    De même pour:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT id_materiel
    FROM materiel
    
    WHERE id_materiel 
    NOT IN (
      SELECT id_materiel
      FROM demande_materiel
      WHERE id_materiel IS NOT NULL 
    )
    ... mais je n'aime pas cette solution (à cause de la requête imbriquée)

  11. #11
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    J'en ai aussi profité pour tester cette requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT M.id_materiel
    FROM materiel AS M
     
    LEFT JOIN demande_materiel AS DM
    ON (M.id_materiel = DM.id_materiel
    AND DM.date_demande_materiel='2006/04/26')
     
    WHERE DM.id_materiel IS NULL
    qui marche très bien !

    Je crois qu'il y a 2 sujets que tu peux mettre en "Résolu" maintenant...

  12. #12
    Membre averti Avatar de PAYASS59
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2005
    Messages : 755
    Points : 324
    Points
    324
    Par défaut
    pour ce qui est de ca , je pense que lorsque ma table auura beaucoup d'enregistrements les perf risquent de pas etre deribles... j'y avais bien pensé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     <div style="text-align: left;">SELECT materiel.id_materiel
     
    FROM materiel
     
    LEFT JOIN demande_materiel
    ON materiel.id_materiel = demande_materiel.id_materiel
     
    WHERE demande_materiel.id_materiel IS NULL</div>

    à l'inverse j'ai teste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     <div style="text-align: left;">SELECT id_materiel
    FROM materiel
     
    WHERE id_materiel 
    NOT IN (
      SELECT id_materiel
      FROM demande_materiel
      WHERE id_materiel IS NOT NULL 
    )</div>
    mais j'ai erreur :
    #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 'SELECT id_materiel
    FROM demande_materiel
    WHERE id_materiel IS

  13. #13
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Chez moi ça passe (MySQL 4.1.9)

  14. #14
    Membre averti Avatar de PAYASS59
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2005
    Messages : 755
    Points : 324
    Points
    324
    Par défaut
    quel con
    je testais sur une version 4.0.17 sans faire gaf

    je viens de tester sur la version 5.0.13 et ca fonctionne


    encore merci
    je mets résolu sur mes posts

  15. #15
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par weedman59
    quel con
    je testais sur une version 4.0.17 sans faire gaf
    Donc pas de requête imbriquée...
    Comme disait Bourvil: "ah ben c'est sûr, elle va marcher beaucoup moins bien maintenant !"

  16. #16
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Points : 1 880
    Points
    1 880
    Par défaut
    Bon apparemment pcaboche a résolu le pb
    Juste une remarque: je crois que faire des JOIN comme il le fait au lieu de subselect est plus performant

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

Discussions similaires

  1. Evalutation d'expression logique/booleenne
    Par eesteban dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 16/06/2004, 14h58
  2. Détection des disques physiques et logiques
    Par TheBigMac dans le forum Assembleur
    Réponses: 3
    Dernier message: 10/06/2004, 21h08
  3. Port parallèle et ou logique
    Par declencher dans le forum Langage
    Réponses: 2
    Dernier message: 05/06/2004, 19h02
  4. Un lecteur logique caché!!!
    Par Cyberman dans le forum Composants
    Réponses: 3
    Dernier message: 05/10/2003, 23h16
  5. ListView->Items->Clear() !!! Qques probl de perf
    Par Nicolas_a69 dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/08/2002, 11h49

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