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 :

Tri complexe : le premier de chaque groupe, puis 2e puis xeme


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Tri complexe : le premier de chaque groupe, puis 2e puis xeme
    Bonjour,

    J'ai longuement cherché une solution à mon problème :

    J'ai une table de produits (10 000) vendus par différents vendeurs (500). Chaque vendeur vend plusieurs produits

    Les produits ont un prix, un vendeur (et d'autres champs sur lesquelles l'internaute peut faire une sélection)

    Je dois afficher mes produits sélectionnés par pages de 10, avec un tri complexe (c'est là que je bute) :

    je dois afficher l'article le plus cher de chaque vendeur , trié par prix
    Lorsque j'ai affiché l'article le plus cher de chaque vendeur, je dois passer au 2e article le plus cher de chaque vendeur (qui ont un 2e article en vente), toujours trié par prix
    etc etc.

    Tout ceci doit être affiché par pages de 10

    Je ne suis pas sûr de pouvoir faire ça en mysql seulement. Qu'en pensez vous ?
    Le problème est que si je fais ça en php avec un tableau, cela m'oblige à lire toute ma sélection a chaque chargement de page et à faire le tri dans un tableau. Je trouve ça très lourd et j'ai peur pour les perfs.

    Qu'en pensez-vous ?

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Piste ? OVER PARTITION BY mais pas en mysql...
    Il semble que la même question a été posée ici, il y a 4 ans :
    http://www.developpez.net/forums/sho...d.php?t=564489

    Le membre qui a répondu conseille l'utilisation de OVER(partition BY

    Mais la réponse ne semble pas concerner mysql...

    Je continue à chercher, si quelqu'un trouve avant moi...

  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 029
    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 029
    Points : 23 748
    Points
    23 748
    Par défaut
    Bonjour,

    La fonction OVER existe sous Oracle, mais pas dans MySQL.
    Par contre, tu peux faire ce qu'on appelle une division relationnelle. Pour t'aider, voilà 2 posts avec des exemples proches de ton problème :
    http://www.developpez.net/forums/sho...d.php?t=519658
    http://www.developpez.net/forums/sho...d.php?t=447231
    Si tu n'yarrives pas, donne-nous le schéma de tes tables, qu'on puisse t'aider à faire le 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

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7
    Points : 5
    Points
    5
    Par défaut schéma de ma table
    Merci pour cette réponse.
    Voici le schéma de ma table :

    Table Produit
    ---------------
    Champ id
    Champ prix
    Champ vendeur
    Champ type

    Exemple, avec une pagination de 3
    Si une sélection contient

    Produit id1, du vendeur X, à 50 €
    Produit id2, du vendeur X, à 40 €
    Produit id3, du vendeur Y, à 30 €
    Produit id4, du vendeur Z, à 20 €

    Il me faut afficher

    Page 1 :
    id1 de X à 50 €
    id3 de Y à 30 €
    id4 de Z à 20 €
    ----------------- (coupure de page => utilisation de LIMIT)
    Page 2 :
    id2 de X à 40 €

  5. #5
    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 029
    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 029
    Points : 23 748
    Points
    23 748
    Par défaut
    Voilà la requête qui permet d'obtenir les produits les plus chers de chaque vendeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select *
    from produit p
    where (
      select count(*)
      from produit p2
      where p2.vendeur = p.vendeur
      and p2.prix > p.prix
    ) < 1
    Par contre, pour sortir uniquement le 2ème prix le plus cher, c'est plus complexe...
    Pour sortir les 2 premiers prix, remplace le 1 par un 2 en fin de condition...

    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

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Du coup, la requête pour avoir le xe, ne serait-ce pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT *
    FROM produit p
    WHERE (
      SELECT count(*)
      FROM produit p2
      WHERE p2.vendeur = p.vendeur
      AND p2.prix > p.prix
    ) = x
    Bon, bien sur, il faut que je teste, mais on s'approche. Si ça marche, j'aurais plus qu'à faire une boucle en php en faisant monter petit à petit le x...Pas totalement mysql mais presque.

    En tout cas je vous tiens au courant.
    Si y'a d'autres pistes, n'hésitez pas
    Dommage quand même que mysql ne propose pas les tris alternés...c'est super utile quand même.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7
    Points : 5
    Points
    5
    Par défaut La réponse
    Voilà, j'ai trouvé exactement ce que je cherchais , notamment grâce à ced et à cette page

    Voici la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT a.id_produit, a.id_vendeur, a.prix, (
      SELECT count( * )
      FROM PRODUIT a2
      WHERE a2.id_vendeur = a.id_vendeur
      AND a2.prix  > a.prix
    ) AS 'position'
    FROM PRODUIT a
    ORDER BY position, a.prix DESC
    Reste plus qu'à optimiser...

    Merci !!

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

Discussions similaires

  1. afficher les 10 premiers enregistrements pour chaque groupe
    Par freestyler dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 19/06/2008, 15h46
  2. Les n premiers pour chaque groupe
    Par Sakalam dans le forum Langage SQL
    Réponses: 5
    Dernier message: 16/07/2007, 16h01
  3. Sélection du premier enregistrement de chaque groupe
    Par mout1234 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 15/05/2007, 16h27
  4. Réponses: 2
    Dernier message: 07/03/2007, 16h30

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