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

Langage SQL Discussion :

requete sql plutot pas facile a faire


Sujet :

Langage SQL

  1. #1
    Débutant   Avatar de kaking
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 753
    Points : 262
    Points
    262
    Par défaut requete sql plutot pas facile a faire
    bonjour tous le monde

    'oilou je selectionne par cette requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM clients c
    LEFT OUTER JOIN service s ON c.id = s.id_user
    autant de fois mes champs de la table clients qu'il y a de id correspondant a id_user.

    Donc si un client a deux services, il sera selectionné deux fois....

    mais je voudrais savoir s'il etait possible de ne selectionner les services correpondant a l'id clients uniquement que si les champs date_relance_service de la table service sont differents.

    ....serait ce possible siouplais
    ????

  2. #2
    Membre actif Avatar de hazamor
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2008
    Messages : 179
    Points : 206
    Points
    206
    Par défaut
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT *
    FROM clients c
    LEFT OUTER JOIN service s ON c.id = s.id_user
    where not Exists (select * from service S1 
                              where s.id_user = c.id 
                               and s.date_relance_service <> S1.date_relance_service)

    Tu utilise Exists.

  3. #3
    Débutant   Avatar de kaking
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 753
    Points : 262
    Points
    262
    Par défaut
    merci mais la ca me retournes plus rien...

    j'ai pas l'impression que ca marche....

    tiens voila un exemple de ce que je voudrais que ca selectionne :

    table clients :

    id-----------------nom_client
    1------------------Pierre
    2------------------Marc


    table service

    id-----------------id_user-------------date_relance_service
    5--------------------1-------------------03/05/09
    6--------------------1-------------------03/05/09
    7--------------------1-------------------08/12/10
    8--------------------7-------------------05/08/09



    alors je voudrais que Marc soit selectionné une fois (0 id_user correspondant a son id donc une fois) et que Pierre soit selectionné 2 fois -actuellement il serait selectionné 3 fois et moi je veux que deux a cause du doublon de date


    actuellement Marc est selectionné une fois et Pierre 3 fois..... comment faire pour selectionner deux Pierre siouplais?



    merci

  4. #4
    Membre actif Avatar de hazamor
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2008
    Messages : 179
    Points : 206
    Points
    206
    Par défaut
    Je propose la requete suivante:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT *
    FROM clients c
    LEFT OUTER JOIN service s ON c.id = s.id_user
    where  s.id= (select min(S1.id) from service S1 
                              where s.id_user = c.id 
                               and s.date_relance_service = S1.date_relance_service)

  5. #5
    Débutant   Avatar de kaking
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 753
    Points : 262
    Points
    262
    Par défaut
    heu...


    desole mais y a marqué

    #1054 - Champ 's.id' inconnu dans where clause

    ?

  6. #6
    Débutant   Avatar de kaking
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 753
    Points : 262
    Points
    262
    Par défaut
    rha j'enrage, je suis sur qu'il existe une requete capable de faire ca, mais je vois pas laquelle...

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    si c'était en oracle le sql serai un genre comme ça:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select id, nom_client from ( 
    select distinct c.id, c.nom_client, s.date_relance
      from client c, service s
     where c.id = s.id_user (+)
    )
    (+) = outer join

    maintenant il faut le traduire en sql mais je ne connais que le sql sous oracle.
    j'espère que ça aide

  8. #8
    Débutant   Avatar de kaking
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 753
    Points : 262
    Points
    262
    Par défaut
    heu....merci mais desole, je traduis pas l'oracle , je suis sous mysql.....


    mais merci quand meme, j'espere que quelqu un pourra me dire si c'est bon....




    pour rappel, je souhaiterai selectionner autant de fois le client qu'il a de services mais que si un client a deux service ayant deux meme date_relance_service , le client n'est selectionné qu'une fois au lieu de deux...

  9. #9
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par kaking Voir le message
    heu...


    desole mais y a marqué

    #1054 - Champ 's.id' inconnu dans where clause

    ?
    Pourtant, il y a bien une colonne id dans ton exemple de données :
    table service

    id-----------------id_user-------------date_relance_service
    5--------------------1-------------------03/05/09
    6--------------------1-------------------03/05/09
    7--------------------1-------------------08/12/10
    8--------------------7-------------------05/08/09
    A toi de corriger la syntaxe. Ou alors donne nous la description complète des tables (SHOW CREATE TABLE en MySQL).

  10. #10
    Débutant   Avatar de kaking
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 753
    Points : 262
    Points
    262
    Par défaut
    voici la structure de ma table clients:

    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
     TABLE `clients` (
      `id` int(255) NOT NULL auto_increment,
      `contact` varchar(255) NOT NULL,
      `adresse` varchar(255) NOT NULL,
      `ville` varchar(255) NOT NULL,
      `service_com` varchar(255) NOT NULL,
      `dpt` varchar(255) NOT NULL,
      `date_relance` varchar(255) NOT NULL,
      `note` varchar(255) NOT NULL,
      `commercial` varchar(255) NOT NULL,
      `telephone` varchar(255) NOT NULL,
      `prestation` varchar(255) NOT NULL,
      `code_postal` varchar(255) NOT NULL,
      `email` varchar(255) NOT NULL,
      `effectif_entreprise` varchar(255) NOT NULL,
      `pays` varchar(255) NOT NULL,
      `site` varchar(255) NOT NULL,
      `fichier` varchar(255) NOT NULL,
      `compte` varchar(255) NOT NULL,
      `statut_com` varchar(255) NOT NULL,
      `reference` varchar(255) NOT NULL,
      `secteur` varchar(255) NOT NULL,
      `fax_com` varchar(255) NOT NULL,
      `telephone_deux` varchar(255) default NULL,
      PRIMARY KEY  (`id`),
      KEY `id` (`id`),
      KEY `contact` (`contact`,`adresse`,`ville`),
      KEY `service_com` (`service_com`,`dpt`,`date_relance`),
      KEY `commercial` (`commercial`,`telephone`,`prestation`),
      KEY `compte` (`compte`,`statut_com`,`telephone_deux`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=10491 ;

    et de ma table service :

    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
    34
    35
    36
    37
     
    -- 
    -- Structure de la table `service`
    -- 
     
    TABLE `service` (
      `ids` int(255) NOT NULL auto_increment,
      `id_user` int(255) NOT NULL,
      `date_relance_service` varchar(255) NOT NULL,
      `service` varchar(255) NOT NULL,
      `civilite` varchar(255) NOT NULL,
      `prenom` varchar(255) NOT NULL,
      `nom` varchar(255) NOT NULL,
      `fonction` varchar(255) NOT NULL,
      `telephoneser` varchar(255) NOT NULL,
      `telephonedeuxservice` varchar(255) NOT NULL,
      `portable` varchar(255) NOT NULL,
      `email_serv` varchar(255) NOT NULL,
      `fax` varchar(255) NOT NULL,
      `type_evenement` varchar(255) NOT NULL,
      `nbparticipant` varchar(255) NOT NULL,
      `budgetppersonne` varchar(255) NOT NULL,
      `budget` varchar(255) NOT NULL,
      `clientmgp` varchar(255) NOT NULL,
      `statut` varchar(255) NOT NULL,
      `note2` varchar(255) NOT NULL,
      `adresse_res` varchar(255) NOT NULL,
      `code_postal_res` varchar(255) NOT NULL,
      `ville_res` varchar(255) NOT NULL,
      `invitation` varchar(255) NOT NULL,
      `publicitaire` varchar(255) NOT NULL,
      `rdv` varchar(255) NOT NULL,
      `dossier` varchar(255) NOT NULL,
      PRIMARY KEY  (`ids`),
      KEY `id_user` (`id_user`),
      KEY `ids` (`ids`,`prenom`,`nom`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=20979 ;

  11. #11
    Membre actif Avatar de hazamor
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2008
    Messages : 179
    Points : 206
    Points
    206
    Par défaut
    changer s.id par s.ids

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT *
    FROM clients c
    LEFT OUTER JOIN service s ON c.id = s.id_user
    where  s.ids= (select min(S1.ids) from service S1 
                              where s.id_user = c.id 
                               and s.date_relance_service = S1.date_relance_service)

  12. #12
    Débutant   Avatar de kaking
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 753
    Points : 262
    Points
    262
    Par défaut
    merci mais desole, ta requete plante mon prog!


    pourtant j'ai bien fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     SELECT *
    FROM clients c
    LEFT OUTER JOIN service s ON c.id = s.id_user
    WHERE  s.ids= (SELECT min(S1.ids) FROM service S1 
                              WHERE s.id_user = c.id 
                               AND s.date_relance_service = S1.date_relance_service)
     LIMIT 0, 20

  13. #13
    Membre actif Avatar de hazamor
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2008
    Messages : 179
    Points : 206
    Points
    206
    Par défaut
    Je ne connais pas la fonction 'Limit', mais je vais corriger ma requete, ce n'est pas 'left join' mais 'inner join'
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT *
    FROM clients c
    INNER JOIN service s ON c.id = s.id_user
    where  s.ids= (select min(S1.ids) from service S1 
                              where s.id_user = c.id 
                               and s.date_relance_service = S1.date_relance_service)

    parceque dans le cas non correspondance la fonction Min va retourner Null

  14. #14
    Débutant   Avatar de kaking
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 753
    Points : 262
    Points
    262
    Par défaut
    ta requete ne doit pas plaire a mysql because que la encore, ca plante mon mysql!!!!

    faut dire que ma table clients comporte 10000 unités et ma tables service 20000......




    en tout cas, cette requete n'a pas l'air de lui plaire!


    tu es sur que cette requete permettrait de selectionner autant de fois le client qu'il a de services mais que si un client a deux service ayant deux meme date_relance_service , le client n'est selectionné qu'une fois au lieu de deux ?

  15. #15
    Membre actif Avatar de hazamor
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2008
    Messages : 179
    Points : 206
    Points
    206
    Par défaut
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT *
    FROM clients c
    INNER JOIN service s ON c.id = s.id_user
    where  s.ids= (select min(S1.ids) from service S1 
                              where s.id_user = c.id 
                               and s.date_relance_service = S1.date_relance_service)

    La requete imbriquée va retourner le premier 'ids' de service qui correspond à un client donné et à une date donnée, ce client et cette date vient de la requete principale, alors: selectionner chaque client qui a fait une service à une date mais en se limitant un seule fois

  16. #16
    Débutant   Avatar de kaking
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 753
    Points : 262
    Points
    262
    Par défaut
    oui mais c'est totalement impossible a faire, quand j'essaie cette requete dans mysql, ca fait planter mon apache, faut tout redemarrer ensuite



    y'aurait pas une autre solution?

  17. #17
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Sur l'idée de la requête de mousty, avec jointure normalisée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT c.id, c.nom_client, tmp.date_relance 
    FROM client c
    LEFT OUTER JOIN ( 
      SELECT DISTINCT s.id_user, s.date_relance
      FROM service s
    ) tmp ON c.id = s.id_user
    Et si tu peux toucher à la structure de la BDD, je te conseille de ne pas mettre tout en VARCHAR 255. C'est par exemple largement surdimensionné pour un code postal ou un numéro de téléphone.

    Voir cet article pour un formatage optimisé des colonnes.

  18. #18
    Débutant   Avatar de kaking
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 753
    Points : 262
    Points
    262
    Par défaut
    merci pour le lien


    sinon j'ai passé le lien du forum a un ami qui m'a dégoté ce code la
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT *
    FROM clients
    	JOIN (
    		SELECT DISTINCT date_relance_service, id_user
    		FROM service
    	) td
    		ON clients.id=td.id_user
    et ca marche!!!!


    mais je sais pas du tout pourquoi.....quelqu un pour me renseigner sur cette requete siouplais?

    merci beaucoup


    -je comprends pas non plus, quand j'essaye ta requete CinePhil y'a marqué
    'La table 'mgp.client' n'existe pas'....pourquoi?

    encore merci tout le monde de votre precieuse aide

  19. #19
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut,

    dans l'exemple que tu as donné, je ne suis pas sur que ta requête va retourner Marc.

    pour la requête de Cinephil, c'est juste le mauvais nom de table : clients et non client

  20. #20
    Débutant   Avatar de kaking
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 753
    Points : 262
    Points
    262
    Par défaut
    oui, desole, mais la maintenant alors que j'ecris ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT * 
    FROM clients c
    LEFT OUTER JOIN ( 
      SELECT DISTINCT s.id_user, s.date_relance_service
      FROM service s
    ) tmp ON c.id = s.id_user
    je recois ceci :

    Champ 's.id_user' inconnu dans on clause....



    je comprends pas pourquoi ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Requete SQL sur un dataset, comment faire ?
    Par Shypster dans le forum C#
    Réponses: 5
    Dernier message: 07/07/2010, 09h49
  2. [MySQL] Requete SQL Fomulaire Html FACILE A TRAITER
    Par bienvenue50 dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 29/03/2010, 17h56
  3. Réponses: 3
    Dernier message: 26/03/2008, 19h47
  4. [Requete SQL]Est-ce possible de faire cela en SQL sous access 2000 ?
    Par titof90 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 18/05/2007, 16h39
  5. probleme avec requete sql aime pas les strings
    Par lil_jam63 dans le forum Bases de données
    Réponses: 3
    Dernier message: 24/02/2004, 15h45

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