ORDER BY et GROUP BY :/

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par viriis, 11 Août 2016.

  1. viriis

    viriis Nouveau WRInaute

    Inscrit:
    30 Juin 2015
    Messages:
    14
    J'aime reçus:
    0
    Bonjours a tous depuis ce matin je galère et maitnenant j'en peux plus :/

    Je n'arrive pas a faire une requête avec un GROUP BY et en plus un ORDER BY
    ma premiere requete
    Code:
    $reqSelect = $bdd->prepare('SELECT viriis_website, viriis_lang, viriis_description, viriis_website_www, viriis_cle FROM viriis_link WHERE viriis_id = :viriis_id GROUP BY viriis_website ORDER BY viriis_id_link desc');
    $reqSelect->execute(array(
        'viriis_id' => $_SESSION['viriis_id']
    ));
    While( patati patata){
    }
    
    Bon celle du dessus le GROUP BY fonctionne mais pas le ORDER BY

    J'ai demandé a un autre forum et personne a trouvé de solution donc c'est pour cela que je viens sur ce forum
    On m'a proposer cette solution
    Code:
    SELECT DISTINCT t.viriis_website,
       t.viriis_lang,
       t.viriis_description,
       t.viriis_website_www,
       t.viriis_cle
    FROM viriis_link t
    INNER JOIN (
       SELECT viriis_website
       FROM viriis_link
       WHERE viriis_id = :viriis_id
       GROUP BY viriis_website
    ) r ON t.viriis_website = r.viriis_website
    ORDER BY t.viriis_id_link DESC;
    
    OU

    Code:
    SELECT DISTINCT t.viriis_website,
       t.viriis_lang,
       t.viriis_description,
       t.viriis_website_www,
       t.viriis_cle
    FROM viriis_link t
    INNER JOIN (
       SELECT viriis_website, viriis_id
       FROM viriis_link
       GROUP BY viriis_id, viriis_website
    ) r ON t.viriis_website = r.viriis_website
    WHERE r.viriis_id = :viriis_id
    ORDER BY t.viriis_id_link DESC;
    
    Bref les deux fonctionne pas le ORDER BY fonctionne bien mais pas le GROUP BY

    Si quelqu'un a une solution je vous remercie :)
     
  2. Marie-Aude

    Marie-Aude WRInaute accro

    Inscrit:
    5 Juin 2006
    Messages:
    18 363
    J'aime reçus:
    0
    Si tu as un group BY le order By est implicite, sur le champ sur lequel tu fais le group By
     
  3. viriis

    viriis Nouveau WRInaute

    Inscrit:
    30 Juin 2015
    Messages:
    14
    J'aime reçus:
    0
    Ok mais alors comment je peux faire?

    Merci
     
  4. rick38

    rick38 WRInaute impliqué

    Inscrit:
    23 Février 2013
    Messages:
    536
    J'aime reçus:
    0
    Un GROUP BY sur le champ viriis_website : dans quel but ?

    J'ai l'impression que tu cherches à faire :

    ORDER BY viriis_website, viriis_id_link desc
     
  5. spout

    spout WRInaute accro

    Inscrit:
    14 Mai 2003
    Messages:
    8 666
    J'aime reçus:
    2
    HS: pourquoi avoir tout préfixé avec viriis_ ?
     
  6. pprem

    pprem WRInaute discret

    Inscrit:
    15 Décembre 2008
    Messages:
    180
    J'aime reçus:
    0
    le GROUP BY prime sur le reste, par contre, es-tu certain que les champs du SELECT sont bien les mêmes pour chaque ligne ayant le même "viriis_website" ?

    parce que si c'est la même chose, tu as quand même beaucoup de redondance dans ta table, faudrait penser à repenser ton modèle de données.

    si c'est pas la même valeur, vire le GROUP BY qui va te donner des résultats incohérents et ne conserve que ORDER BY viriis_website,viriis_id_link desc

    le GROUP BY sert à faire des comptages, récupérer des infos uniques sur une table, pas à sortir des valeurs de la table autres que celles des champs regroupés
     
  7. viriis

    viriis Nouveau WRInaute

    Inscrit:
    30 Juin 2015
    Messages:
    14
    J'aime reçus:
    0
    Non, je ne veux vraiment pas que mon champ viriis_website apparaisse plusieurs fois


    Heu ben en faite j'ai commencé comme ça et après j'ai plus réussi a m’arrêter
    :)

    Je me réexplique :)



    ALors en gros pour faire plus simple :)
    Je suis entrain de créér un site internet ou des utilisateurs peuvent rentré plusieurs fois (1fois par moi) leurs site internet (je parle du même site internet).

    Exemple:

    J'ajoute un site.
    http://www.sitenumero2.com
    Pendant ce temps ce site a été noté plusieurs fois et a une moyenne de 15/20

    Puis l'utilisateur veut rentrer de nouveau son site 1 mois après
    http://www.sitenumero2.com qui prendra la moyenne de l'ancien site 15/20

    PS: je ne veux pas supprimer l'ancien site avant l'insertion du nouveau.

    Je veux ensuite afficher un top site classé par meilleurs notes (VIRIIS_AVERAGE) mais ne pas afficher 2 fois le même site et récupérer le plus récent ajouté.

    Ci-dessous ma base VIRIIS_LINK
    [​IMG]
    http://upic.fr/img/57ad8d3eeb4a1.png

    Code:
    $reqSelect = $bdd->prepare(
    'SELECT 
    viriis_lang,
     viriis_premium,
     viriis_website,
     viriis_average,
     viriis_id_link,
     viriis_id,
     viriis_protect,
     viriis_description,
     viriis_website_prefix,
     viriis_website_www
     FROM
     viriis_link
     WHERE
     viriis_total_note > 9 
    GROUP BY viriis_website 
    ORDER BY 
    viriis_average DESC LIMIT 100');
    
    $reqSelect->execute(array());
    while($donnee = $reqSelect->fetch()){
    
    
    Bon ben lol j’espère que vous avez compris
     
  8. viriis

    viriis Nouveau WRInaute

    Inscrit:
    30 Juin 2015
    Messages:
    14
    J'aime reçus:
    0
    Probleme résolu

    avec

    Code:
    $reqSelect = $bdd->prepare('SELECT viriis_lang, viriis_premium, max(viriis_last_update) as max_viriis_last_update, viriis_website, viriis_average, viriis_id_link, viriis_id, viriis_protect, viriis_description, viriis_website_prefix, viriis_website_www 
    							FROM viriis_link 
    							WHERE viriis_total_note > 9 
    							GROUP BY viriis_last_update 
    							ORDER BY viriis_average DESC
    							LIMIT 100');
    $reqSelect->execute(array());
    Merci
     
  9. viriis

    viriis Nouveau WRInaute

    Inscrit:
    30 Juin 2015
    Messages:
    14
    J'aime reçus:
    0
    HEuu ben non car la base de donnée GROUP BY par le sens inverse que je veux
    donc je me retrouve avec les anciens sites est non les nouveaux GRRRR

    Une solution svp?
     
  10. Marie-Aude

    Marie-Aude WRInaute accro

    Inscrit:
    5 Juin 2006
    Messages:
    18 363
    J'aime reçus:
    0
    Je pense que tu confonds deux choses, la sélection et l'affichage, d'une part.

    Rien n'empêche de retravailler en php les résultats d'une sélection....

    D'autre part, ta base, dans ce cas, est assez mal conçue, il suffirait de dater les enregistrements avec les notes dans une base à part pour résoudre tous tes problèmes (et utiliser les fonctions dates, pour sélectionner sur le mois le plus récent, avec la fonction Max par exemple).
     
  11. viriis

    viriis Nouveau WRInaute

    Inscrit:
    30 Juin 2015
    Messages:
    14
    J'aime reçus:
    0
  12. pprem

    pprem WRInaute discret

    Inscrit:
    15 Décembre 2008
    Messages:
    180
    J'aime reçus:
    0
    euh... ou sinon tu peux aussi revoir la façon de stocker les infos dans ta base de données pour qu'elle soit cohérente. :)
     
  13. viriis

    viriis Nouveau WRInaute

    Inscrit:
    30 Juin 2015
    Messages:
    14
    J'aime reçus:
    0
    Salut,

    Pourquoi mes donnée ne sont pas cohérente, j'ai mal fais les choses si je peux améliorer je veux bien des conseils

    Merci
     
  14. pprem

    pprem WRInaute discret

    Inscrit:
    15 Décembre 2008
    Messages:
    180
    J'aime reçus:
    0
    mal je ne sais pas, mais ça sent la base pas conçue comme elle devrait l'être si elle était relationnelle et exempte de redondances inutiles

    d'après les éléments que tu nous as donnés, tu as une table qui contient des infos saisies régulièrement par des internautes. dans le cas présent c'est l'URL du site qui servirait de clé pour retrouver les X versions de sa description & co. tu stockes une note dans la même table. cette note peut basculer sur la version suivante de la table quand elle est saisie et tu n'affiches que cette dernière version (je suppose après validation).

    d'après ces éléments, ton modèle de données me semblerait plus juste avec ça :
    - sites : id, url, note, ...
    - sites_infos: id, site_id, langue_id, date_saisie, description, ...
    - langues : id, libelle

    mais bon, difficile de se prononcer juste avec les éléments présents ici.
     
  15. viriis

    viriis Nouveau WRInaute

    Inscrit:
    30 Juin 2015
    Messages:
    14
    J'aime reçus:
    0
    A ok,

    J'ai compris ce que tu veux dire oui, il y a sans doute des modifications a faire...

    Merci en tous cas d'avoir pris le temps :)
    A plus
     
  16. noren

    noren WRInaute accro

    Inscrit:
    8 Avril 2011
    Messages:
    2 918
    J'aime reçus:
    0
    Salut

    Pense a faire un explain de ta requête et à vérifier lorsque le nombre d'enregistrements commencent à devenir important pour voir son comportement. Ne jamais se jeter sur la première solution venue qui semble marcher. Tu peux parfois avoir de désagréables surprises
     
  17. viriis

    viriis Nouveau WRInaute

    Inscrit:
    30 Juin 2015
    Messages:
    14
    J'aime reçus:
    0

    Ok merci beaucoup :)