PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 24-06-2010 16:30:00

macfred
Membre
Inscription : 24-06-2010
Messages : 4

Les plus populaires du mois

Salut,

J'ai besoin de classer des vidéos sur mon site en les organisant par "les plus populaires du mois" mais aussi de la semaine et du jour. Je me demande comment construire ma base de données pour pouvoir retrouver cette information.

J'ai pensé lister toutes les vidéos par date dans une seule table, mais lorsque je vais faire ma requête, je vais avoir beaucoup de lignes pour pas grand chose et je sais pas vraiment comment additionner les lignes pour les classer en populaires. Alors j'ai aussi pensé à incrémenter un compteur, mais dans ce cas là, c'est impossible d'attribuer une date à cette incrémentation...

Quelqu'un a-t-il une idée ou des suggestions pour m'aider à avancer dans ma réflexion ?

Merci !

Hors ligne

#2 25-06-2010 12:04:05

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Les plus populaires du mois

Saluton,
Qu'entends-tu par les vidéos les plus populaires ?
Sur quels événements se fonde cette popularité ?


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#3 25-06-2010 20:39:07

macfred
Membre
Inscription : 24-06-2010
Messages : 4

Re : Les plus populaires du mois

Salut,
Sur mon site, j'ai plusieurs vidéo, et à chaque fois que quelqu'un clique sur le lien de cette vidéo, il faudrait qu'elle gagne +1 en popularité. En fait, en discuttant avec un collègue qui est bien au courant du SQL, j'ai réussi à trouver la solution.

Donc à chaque fois qu'une vidéo est vue, j'ajoute une entrée dans la BD (date,titre,url)

Ensuite pour trouver lesquelles sont les plus populaires du mois, je fais la requête suivante :

select titre,url, count(titre) as titrecount FROM films WHERE date BETWEEN '".$lastmonth."' and '".$today."' GROUP BY titre order by titrecount DESC LIMIT 0,10

Le résultat montre les 10 vidéos les plus populaires en ordre décroissant. Le truc était de faire la bonne requête. SQL c'est vraiment bien quand on maîtrise...

Dernière modification par macfred (25-06-2010 20:39:48)

Hors ligne

#4 25-06-2010 21:15:31

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : Les plus populaires du mois

Table film
id int
titre char(50)
url varchar(100)


Table vue
id int
id_film int
nbvue int
date datetime

incrmenter le champ nbvue et mettre la date a jour a chaque vue wink


et la requete

SELECT titre,url,nbvue from film left join vue on film.id=vue.id_film

ecrit a l'arrache, donc a verifier la s1axe exact wink

a++

Hors ligne

#5 25-06-2010 21:41:03

macfred
Membre
Inscription : 24-06-2010
Messages : 4

Re : Les plus populaires du mois

Salut Pierrot,

La solution que j'ai postée au dessus de ton message contient 1 seule table de 3 colonnes et 1 seule requête d'insertion (pas besoin d'incrémenter). Est-ce qu'il y a une raison pour laquelle tu préconises cette solution plutôt que la mienne ?

Hors ligne

#6 26-06-2010 06:35:12

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Les plus populaires du mois

Saluton,
La solution de Pierrot évite le stockage redondant d'infos lourdes titre, url.
La colonne id de la table vue n'est pas indispensable, de mon point de vue.
Entre un UPDATE à chaque vue ou un INSERT, les performances doivent être très proches.
Par contre la requête de consultation sans comptage ni GROUP BY sera beaucoup plus rapide.
Seul bémol, on perd l'historique des consultations ce qui ne permet plus de fournir des statistiques de consultation sur une plage de dates.
Si c'était indispensable, il suffirait de modifier la table vue en supprimant la colonne nbvue, la requête de consultation, en jointure externe, devrait réintégrer un comptage et, partant, un GROUP BY.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#7 26-06-2010 09:06:30

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : Les plus populaires du mois

Pour m'être penché dernièrement sur les temps de traitement update et insert voilà ma contribution :
Un update (et ce quelque soit le nombre de termes, 1 ou 6 dans mes tests avec un textarea de plus de 200 mots) met environ autant de temps qu'un insert (insertion des 6 champs est très proche du update, l'insertion d'un seul champ mettant moins de temps).

Mais je cherche encore car cela ne me semble pas vraiment logique qu'une modification d'un seul champ mette autant de temps qu'un gros insert. Bon certes il y a la recherche à prendre en compte mais tout de même... On passe de 20ms pour un update et un insert à 6champs à tout juste 4ms pour un insert de un champ...

Hors ligne

#8 26-06-2010 10:59:22

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Les plus populaires du mois

Là encore, il ne faut pas négliger le temps requis pour la mise à jour des différents index.
Ceux-ci accélèrent les recherches et les jointures, mais pénalisent les ajouts, suppressions et modifications.
En matière d'optimisation de SGBD tout demeure affaire de compromis.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#9 26-06-2010 16:57:58

macfred
Membre
Inscription : 24-06-2010
Messages : 4

Re : Les plus populaires du mois

Merci pour votre aide.

Le gros problème de l'incrémentation est qu'il m'est impossible de connaître "les meilleurs du mois". La solution la plus logique serait de fonctionner avec 2 tables, une qui contient le ID, titre, l'url et l'autre qui contient IDtitre, date. Je ferais donc 1 insert qui ne contiendrait qu'un INT et une DATE.

Par contre, ma requête se fera toujours sur les champs insérés dans le mois en cours donc leur quantité restera limité lors de la requête. C'est vrai que j'ai de la redondance dans mes tables en utilisant cette méthode. Je me tate...

Je vais voir avec la première solution dont j'ai parlé, et je verrais d'ici quelques mois si j'ai besoin de passer avec une version plus légère ou non.

Hors ligne

Pied de page des forums