ORDER BY et GROUP BY :/

  • Auteur de la discussion Auteur de la discussion viriis
  • Date de début Date de début
Nouveau WRInaute
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 :)
 
WRInaute passionné
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
 
WRInaute discret
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

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

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
 
Nouveau WRInaute
rick38 a dit:
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

Non, je ne veux vraiment pas que mon champ viriis_website apparaisse plusieurs fois


spout a dit:
HS: pourquoi avoir tout préfixé avec viriis_ ?

Heu ben en faite j'ai commencé comme ça et après j'ai plus réussi a m’arrêter
pprem a dit:
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

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


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
:)

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
57ad8d3eeb4a1.png

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
 
Nouveau WRInaute
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
 
Nouveau WRInaute
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?
 
WRInaute accro
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).
 
WRInaute discret
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. :-)
 
Nouveau WRInaute
Salut,

pprem a dit:
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. :-)

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
 
WRInaute discret
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.
 
Nouveau WRInaute
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
 
WRInaute accro
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
 
Nouveau WRInaute
noren a dit:
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


Ok merci beaucoup :)
 
Discussions similaires
Haut