Consultez la formation SEO spéciale Wordpress
par WebRankInfo / Ranking Metrics

Messages: 15

Enregistré le: 30 Juin 2015

Message le Jeu Aoû 11, 2016 16:38

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: Tout sélectionner
$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: Tout sélectionner
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: Tout sélectionner
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 :)
Haut
16 Réponses
Messages: 18372

Enregistré le: 5 Juin 2006

Message le Jeu Aoû 11, 2016 17:06

Si tu as un group BY le order By est implicite, sur le champ sur lequel tu fais le group By
Haut
Messages: 15

Enregistré le: 30 Juin 2015

Message le Jeu Aoû 11, 2016 17:34

Ok mais alors comment je peux faire?

Merci
Haut
Messages: 503

Enregistré le: 23 Fév 2013

Message le Ven Aoû 12, 2016 8:57

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
Haut
Messages: 8547

Enregistré le: 14 Mai 2003

Message le Ven Aoû 12, 2016 9:12

HS: pourquoi avoir tout préfixé avec viriis_ ?
Haut
Messages: 180

Enregistré le: 15 Déc 2008

Message le Ven Aoû 12, 2016 10:09

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
Haut
Messages: 15

Enregistré le: 30 Juin 2015

Message le Ven Aoû 12, 2016 11:01

rick38 a écrit: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 écrit: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 écrit: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
Image
http://upic.fr/img/57ad8d3eeb4a1.png

Code: Tout sélectionner
$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
Haut
Messages: 15

Enregistré le: 30 Juin 2015

Message le Ven Aoû 12, 2016 12:47

Probleme résolu

avec

Code: Tout sélectionner
$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
Haut
Messages: 15

Enregistré le: 30 Juin 2015

Message le Ven Aoû 12, 2016 13:16

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?
Haut
Messages: 18372

Enregistré le: 5 Juin 2006

Message le Ven Aoû 12, 2016 14:04

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).
Haut
Messages: 15

Enregistré le: 30 Juin 2015

Message le Ven Aoû 12, 2016 15:47

Merci mais je viens de trouver avec cette requette
Code: Tout sélectionner
SELECT l.*
FROM livre l
INNER JOIN
(
SELECT categorie, MAX(date) AS maxDate
FROM livre
GROUP BY categorie
) groupel ON l.categorie = groupel.categorie AND l.date = groupel.maxDate


La source pour ceux qui veulent
http://www.journaldunet.com/developpeur/pratique/developpement/12297/comment-faire-un-select-en-utilisant-max-sur-une-colonne-et-distinct-sur-une-autre-colonne-en-sql.html

A plus
Haut
Messages: 180

Enregistré le: 15 Déc 2008

Message le Sam Aoû 13, 2016 11:16

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. :-)
Haut
Messages: 15

Enregistré le: 30 Juin 2015

Message le Sam Aoû 13, 2016 14:38

Salut,

pprem a écrit: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
Haut
Messages: 180

Enregistré le: 15 Déc 2008

Message le Dim Aoû 14, 2016 10:05

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.
Haut
Messages: 15

Enregistré le: 30 Juin 2015

Message le Dim Aoû 14, 2016 10:08

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
Haut
Messages: 2911

Enregistré le: 8 Avr 2011

Message le Lun Aoû 15, 2016 11:48

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
Haut
Messages: 15

Enregistré le: 30 Juin 2015

Message le Lun Aoû 15, 2016 11:49

noren a écrit: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 :)
Haut

Formation recommandée sur ce thème :

Formation SEO spéciale Wordpress : apprenez à optimiser le référencement naturel d'un site fait avec Wordpress... Formation Ranking Metrics animée par un expert SEO / Wordpress.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.