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 :

[Mysql 3]Sélection des 2 MAX


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    tyx
    tyx est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 52
    Par défaut [Mysql 3]Sélection des 2 MAX
    Bonjour bonjour,

    après une belle prise de tête, j'en suis venu à me dire que ce que je voulais faire était impossible, mais avant je viens le vérifier par ici ^^

    Donc comme mon titre l'indique, je suis en environnement mysql3, no comment, on fait avec ce qu'on nous donne.

    Voici le contexte:
    J'ai 2 tables, une qui stock des marchants identifié par un id, et une table data qui stock pour chaque lancement d'un script, 2 nombres extrait de diverses informations, ainsi que la date de cette insertion.
    Le but du jeu est donc de sélectionner les 2 données avec les 2 plus récentes dates pour chaque id.

    Actuellement, j'ai bidouillé un truc avec php pour jouer sur les dates, le lancement du script ne devant être que journalier. Mais on vient de me faire remarquer que ce ne sera peut-être pas toujours le cas.

    Donc j'en suis rendu là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT MAX(d1.date),MAX(d2.date),d1.merchantid,d1.uncat_offer,d1.total_offer,d2.uncat_offer,d2.total_offer from tomm_data d1,tomm_data d2 where d1.date>d2.date AND d1.merchantid=d2.merchantid GROUP BY d1.merchantid;
    Qui a l'air de fonctionner, mais en fait les d2.uncat_offer et d2.total_offer ne correspondent pas au champ du MAX(d2.date)
    ce qui après reflexion parait logique.
    Mais ca ne me fait pas avancer, voici le résultat donné.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    +--------------+--------------+------------+-------------+-------------+-------------+-------------+
    | MAX(d1.date) | MAX(d2.date) | merchantid | uncat_offer | total_offer | uncat_offer | total_offer |
    +--------------+--------------+------------+-------------+-------------+-------------+-------------+
    |   1174385390 |   1174383710 |        110 |         738 |      234987 |         738 |      234987 |
    |   1174385390 |   1174383710 |        304 |          62 |        2845 |          62 |        2845 |
    |   1174385390 |   1174383710 |        372 |           1 |        1568 |           1 |        1568 |
    |   1174385390 |   1174383710 |        515 |         271 |      180556 |         271 |      180556 |
    |   1174385390 |   1174383710 |        840 |         416 |       30919 |         416 |       30919 |
    |   1174385390 |   1174383710 |       1061 |           0 |           0 |           0 |           0 |
    |   1174385390 |   1174383710 |       1096 |          32 |        2318 |          32 |        2318 |
    Et voici mes tables
    table 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    +------------+--------------+------+-----+---------+-------+
    | Field      | Type         | Null | Key | Default | Extra |
    +------------+--------------+------+-----+---------+-------+
    | merchantid | int(8)       |      | PRI | 0       |       |
    | name       | varchar(100) |      |     |         |       |
    | country    | varchar(5)   |      |     |         |       |
    | date_in    | int(10)      |      |     | 0       |       |
    | priority   | int(10)      |      |     | 0       |       |
    +------------+--------------+------+-----+---------+-------+
    et
    table 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    +-------------+---------+------+-----+---------+-------+
    | Field       | Type    | Null | Key | Default | Extra |
    +-------------+---------+------+-----+---------+-------+
    | merchantid  | int(8)  |      |     | 0       |       |
    | total_offer | int(10) |      |     | 0       |       |
    | uncat_offer | int(10) |      |     | 0       |       |
    | priority    | int(10) |      |     | 0       |       |
    | date        | int(10) |      |     | 0       |       |
    +-------------+---------+------+-----+---------+-------+
    Et donc pour chaque merchantid de la table1, il me faudrait les 2 tuples de la table2 correspondant aux 2 dernières dates.

    Merci à celui qui aura le courage de jeter un oeil à tout ce charabia.

  2. #2
    tyx
    tyx est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 52
    Par défaut
    Le silence me confirme l'impossibilité du truc. Tant pis ^^

  3. #3
    Membre Expert
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Par défaut
    Sans requête imbriquée les possibilités sont effectivement limitées. Ca devrait pouvoir se faire en une seule fois avec (à ce qu'il me semble) deux jointures en plus mais ce sera une catastrophe en terme de performances (il faudra peu de volume de données avant que la requête ne PRENNE a journée ).

    Le plus efficace risque d'être de boucler sur les 'merchantid' avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT date, merchantid, uncat_offer, total_offer
    FROM tomm_data
    WHERE merchantid = ?
    ORDER BY date DESC
    LIMIT 2
    en prenant soin d'indexer merchantid (et même (merchantid, date), encore qu'il faudrait peut-être inverser l'ordre des dates pour que ça fonctionne) ! Car mine de rien les DESC des tables montrent qu'il n'y a pas d'indexation hormis la clef primaire de la première table


    Si ça devient vraiment critique en terme de performances, marquer les deux dernier (avec un champ dédié) pourrait aider mais il faut le tenir à jour à chaque modification et c'est pas marrant.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 08/10/2013, 23h20
  2. Sélection des items du menu
    Par Depteam1 dans le forum MFC
    Réponses: 3
    Dernier message: 04/03/2005, 11h30
  3. Sélection des disques durs
    Par kurkaine dans le forum C++Builder
    Réponses: 2
    Dernier message: 22/10/2004, 10h56
  4. Requete de sélection des 5 dernièrs entrées.
    Par WriteLN dans le forum Administration
    Réponses: 4
    Dernier message: 22/03/2004, 21h40
  5. sélection des bd en fonction des utilisateurs (pg_hba.conf)
    Par Bouboubou dans le forum PostgreSQL
    Réponses: 9
    Dernier message: 18/03/2004, 18h34

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