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 :

Sélection sur plusieurs tables


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Points : 156
    Points
    156
    Par défaut Sélection sur plusieurs tables
    Bonjour à tous,

    J'ai besoin de faire une requête sur laquelle je me casse les dents depuis plusieurs heures.
    J'ai une table client qui, pour chaque ligne, à un numéro unique.
    J'ai une table comptage qui reprend chaque vérification pour les clients (numéro unique).
    Donc j'aurai plusieurs ligne dans ma table comptage pour chaque client.

    Je dois récupèrer de la table comptage la ligne la plus récente pour chaque client (basé sur un champ date et un champ heure.

    Pour info je suis sous MySQL.

    Quelqu'un pourrait me donner un dlbut pour ma requête car je rame complètement.

    Merci d'avance.
    WebAgency www.cpstyle.net
    BncAgency www.bncmasters.net

  2. #2
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT client.numero, 
    MAX (comptage.date)
    FROM client 
    INNER JOIN (ou LEFT OUTER JOIN si necessaire...) comptage
    ON client.numero = comptage.numero
    GROUP BY client.numero;
    PS: jette 1 coup d'oeil ici avant tes prochains posts : http://www.developpez.net/forums/viewtopic.php?t=32668

    A +

  3. #3
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Points : 156
    Points
    156
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SQL-query :  
     
    SELECT client.numero, MAX( comptage.date ) 
    FROM CLIENT INNER JOIN client.numero = comptage.numero 
     
    MySQL said: 
     
     
    #1064 - Erreur de syntaxe près de '.numero' à la ligne 2
    Ca semble pas vouloir fonctionner. On précise bien la table, ca ne devrait pas être ambigu.
    WebAgency www.cpstyle.net
    BncAgency www.bncmasters.net

  4. #4
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    Re,

    Il manque le nom de la table après le JOIN ...

    [EDIT]
    INNER JOIN comptage
    ON client.numero = comptage.numero

    Il manquait aussi le ON ... Dsl.. J'enlève mes mouffles pour taper la prochaine fois ...
    [/EDIT]

  5. #5
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Points : 156
    Points
    156
    Par défaut
    Sincèrement désolé j'avais pas vu l'erreur

    Es-tu sur que cela me renvoie le dernier record ou simpklement la plus haute valeur du champ?
    Il me faut pas seulement la valeur, mais tout le record associé à la plus grande date / heure pour chaque client.

    Moi j'ai plutôt l'impression que ca me renvoie la plus grande date de chaque client... Ce qui n'est pas mon but.

    Merci pour ton aide en tout cas.
    WebAgency www.cpstyle.net
    BncAgency www.bncmasters.net

  6. #6
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    Re,

    J'avais pas compris qu'il te fallait tte la ligne ...
    Essaies-ça ... (g pas testé ...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT comptage.*
    FROM comptage 
    inner join client
    on client.numero = comptage.numero 
    where comptage.datec = 
    (select max(s.datec) 
    from comptage s 
    where s.numero = comptage.numero 
    group by s.numero);

  7. #7
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Points : 156
    Points
    156
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT comptage.*
            FROM comptage 
            INNER JOIN client ON client.numero = comptage.numero 
            WHERE comptage.date = 
            (SELECT MAX(s.date) 
            FROM comptage s 
            WHERE s.numero = comptage.numero
            GROUP BY s.numero)
    J'ai l'erreur suivante:
    Erreur de syntaxe près de 'SELECT MAX(s.date) FROM comptage s WHERE s.numero = comptage.num' à la ligne 1
    J'ai vérifié les parenthèses et la syntaxe mais je vois pas le problème. Peut-être n'accepte-t-il pas l'alias?
    WebAgency www.cpstyle.net
    BncAgency www.bncmasters.net

  8. #8
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Points : 156
    Points
    156
    Par défaut
    OK je dois updater MySQL en 4.1 minimum pour les requètes imbriquées...

    Je fais ca demain et je te donne mon résultat. Encore un tout grand merci pour ton aide.

    Bonne soirée.
    WebAgency www.cpstyle.net
    BncAgency www.bncmasters.net

  9. #9
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    Quelle est ta V° de MySQL ?
    Il me semble que ttes n'acceptent pas les requêtes corrélées.

    [edit]grillé... [/edit]

  10. #10
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Points : 156
    Points
    156
    Par défaut
    yep grillé d'un quart de fifrelin (1 minute quoi....)
    WebAgency www.cpstyle.net
    BncAgency www.bncmasters.net

  11. #11
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Points : 156
    Points
    156
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT comptage.* FROM comptage INNER JOIN client ON client.numero = comptage.numero 
                WHERE comptage.date = 
                (SELECT MAX(s.date) 
                FROM comptage s 
                WHERE s.numero = comptage.numero 
                GROUP BY s.numero)
    Lorsque j'exécute la requête par phpMyAdmin ou par mon application vb.net, le comportement est le même; boucle infinie

    La page PHP charge indéfiniment et mon application devient "Not responding" sans envoi d'erreur.

    Je dirais que quelque chose ne va pas dans cette requête.
    S'il est préférable que je déplace mon post vers le forum MySQL, n'hésitez pas à me le faire savoir.
    WebAgency www.cpstyle.net
    BncAgency www.bncmasters.net

  12. #12
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    Bonjour,

    SELECT comptage.* FROM comptage INNER JOIN client ON client.numero = comptage.nu
    mero WHERE comptage.date = (SELECT MAX(s.date) FROM comptage s WHERE s.numero =
    comptage.numero GROUP BY s.numero)

    NUMERO DATE
    ----------- --------------------
    1 03/01/2005
    2 03/02/2005
    3 03/03/2005
    Les symptomes semblaient indiquer 1 produit cartésien... et pourtant chez moi c'est OK. Pour voir essaies de supprimer 'INNER JOIN client ON client.numero = comptage.numero' puisque la table client n'est pas utilisée.
    Pour MYSql je ne peux vraiment pas t'aider.
    A +

  13. #13
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Points : 156
    Points
    156
    Par défaut
    c'est idem sans le inner join :s

    J'aurai peut-être une réponse plus spécifique du côté de MySQL... Je peux déplacer mon post ou je dois recréer?
    WebAgency www.cpstyle.net
    BncAgency www.bncmasters.net

  14. #14
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Essaie cette requête un peu différente (ça marche chez moi) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM client, comptage cpt
    where client.numero = cpt.numero
    and cpt.date = (select max(date) from comptage where numero = cpt.numero)
    Pensez au bouton

  15. #15
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Points : 156
    Points
    156
    Par défaut
    J'ai le même comportement, pas d'erreur mais un temps infini d'attente...

    Structure des 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
    CREATE TABLE client (
      id_client int(5) NOT NULL auto_increment,
      numero int(5) NOT NULL default '0',
      name varchar(25) NOT NULL default '',
      ligne int(2) NOT NULL default '0',
      factmul decimal(4,3) NOT NULL default '1.000',
      chauffage decimal(4,3) NOT NULL default '0.200',
      messtelle varchar(25) NOT NULL default '',
      controle int(1) NOT NULL default '1',
      facture int(1) NOT NULL default '1',
      teletrans int(11) NOT NULL default '0',
      mesure int(11) NOT NULL default '1',
      shipper varchar(10) NOT NULL default 'S1',
      mysoteg int(11) NOT NULL default '1',
      PRIMARY KEY  (id_client)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    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
    38
    39
    40
    41
    CREATE TABLE comptage (
      id_comptage int(10) NOT NULL auto_increment,
      date_lecture date NOT NULL default '0000-00-00',
      numero int(5) NOT NULL default '0',
      station varchar(20) NOT NULL default '',
      `date` varchar(15) NOT NULL default '',
      heure varchar(10) NOT NULL default '',
      ligne int(5) NOT NULL default '0',
      compbrut int(15) NOT NULL default '0',
      cptchauf int(15) NOT NULL default '0',
      corrige1 int(15) NOT NULL default '0',
      bct int(15) NOT NULL default '0',
      bruthf int(15) NOT NULL default '0',
      brutbf int(15) NOT NULL default '0',
      ajoute_chauf int(11) NOT NULL default '0',
      ajoute1 int(11) NOT NULL default '0',
      ajoute2 int(11) NOT NULL default '0',
      p decimal(10,3) NOT NULL default '0.000',
      t decimal(10,3) NOT NULL default '0.000',
      cf decimal(10,3) NOT NULL default '0.000',
      pcs decimal(5,4) NOT NULL default '0.0000',
      error int(5) NOT NULL default '0',
      defcorr int(15) NOT NULL default '0',
      defbrut int(15) NOT NULL default '0',
      diaph int(15) NOT NULL default '0',
      cptelecj int(15) NOT NULL default '0',
      cptelecn int(15) NOT NULL default '0',
      cptelecp int(15) NOT NULL default '0',
      energie bigint(30) NOT NULL default '0',
      message longtext NOT NULL,
      over_cor1 int(1) NOT NULL default '0',
      overbct int(1) NOT NULL default '0',
      over_brut1 int(1) NOT NULL default '0',
      over_bruthf int(1) NOT NULL default '0',
      over_brutbf int(1) NOT NULL default '0',
      over_chauf int(1) NOT NULL default '0',
      over_engy int(1) NOT NULL default '0',
      factmul decimal(4,3) NOT NULL default '0.000',
      teletrans int(11) NOT NULL default '0',
      KEY id_comptage (id_comptage)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    Si quelqu'un veux des exemples d'INSERT pour avoir des données, je peux vous les fournir.
    Mon problème ne viendrait pas plutôt du côté config MySQL?

    Pourquoi je ne reçois pas d'erreur à la fin du timeout?
    WebAgency www.cpstyle.net
    BncAgency www.bncmasters.net

  16. #16
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Tu as essayé exactement cette requête ? Et avec le client en ligne de commande ça donne quoi ?
    Pensez au bouton

  17. #17
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Points : 156
    Points
    156
    Par défaut
    mea culpa, çà fonctionne en fait, le seul problème c'est:
    Showing rows 0 - 120 (121 total, Query took 143.0290 sec)
    SQL-query:
    SELECT *
    FROM CLIENT , comptage cpt
    WHERE (
    client.numero = cpt.numero
    )
    AND cpt.date = (
    SELECT max( date )
    FROM comptage
    WHERE numero = cpt.numero )
    Via PhpMyAdmin il me donne le temps d'exécution de 121 total, Query took 143.0290 sec.
    Je trouve çà anormalement long pour cette requête. Que pourrais-je optimiser pour avoir un délai plus court (largement plus court)
    WebAgency www.cpstyle.net
    BncAgency www.bncmasters.net

  18. #18
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Rajoute un index sur comptage.date et comptage.numero
    Pensez au bouton

  19. #19
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Points : 156
    Points
    156
    Par défaut
    PERFECT.

    Ca prend 2 secondes maintenant.

    Une dernière question sur cette requête, je voudrais savoir comment faire pour convertir les champ date et heure de type varchar en champs date et time pour que la fonction MAX me retourne le plus résent, et pas le plus grand par ordre alphabétique.
    Voici un exemple de contenu pour le champ date:
    01-sept-03

    J'ai essayé avec les fonctions de conversion de MySQL:
    strtodate, date, date_format, mais je n'arrive à rien.

    Autre chose, ce serait possible de vérifier sur les champs date ET heure? Je fais simplement un AND? Parce que si le champ heure est plus petit mais que le champ date est le plus grand, c'est quand même ce record la que je dois prendre. Idéalement, il faudrait tester dans le style suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MAX(DATE(compteur.date & compteur.heure, "dd-mm-YYYY hh:mm:ss))
    Mais ca ne fonctionne évidement pas...
    WebAgency www.cpstyle.net
    BncAgency www.bncmasters.net

  20. #20
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Citation Envoyé par WriteLN
    Voici un exemple de contenu pour le champ date:
    01-sept-03

    J'ai essayé avec les fonctions de conversion de MySQL:
    strtodate, date, date_format, mais je n'arrive à rien.
    Normal, "sept" ne correspond à rien de valide pour MySQL. A la rigueur si c'était des chaines du style '2005-09-28' ça pourrait fonctionner...

    Citation Envoyé par WriteLN
    Autre chose, ce serait possible de vérifier sur les champs date ET heure? Je fais simplement un AND? Parce que si le champ heure est plus petit mais que le champ date est le plus grand, c'est quand même ce record la que je dois prendre.
    La meilleure solution consiste à transformer cette colonne texte en colonne de type datetime. Mais ça nécessite de créer une moulinette pour faire passer toutes les dates au bon format...
    Pensez au bouton

Discussions similaires

  1. Sélection sur plusieurs tables
    Par Alexandre le Grand dans le forum Linq
    Réponses: 0
    Dernier message: 26/07/2014, 15h36
  2. [AC-2003] Traduction en VBA d'une requête Sélection SQL sur plusieurs tables
    Par Pucho Faritas dans le forum VBA Access
    Réponses: 9
    Dernier message: 29/10/2009, 10h32
  3. Requête complexe sur plusieurs table
    Par DenPro dans le forum Langage SQL
    Réponses: 13
    Dernier message: 25/11/2003, 17h50
  4. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26
  5. [SQL] Sélection ds plusieurs table
    Par lord_paco dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 24/07/2003, 17h53

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