2015-09-30 4 views
0

J'essaie de créer un appel de base de données Trending Posts pour ma page d'accueil.Données sur les tendances SQL

La meilleure façon de le faire serait de créer 2 tables entières.

Le problème que je rencontre est de trier ces résultats.

Voici à quoi ressemble ma table, je garde une trace des 10 derniers messages tendance.

name   trending    clicks 
post1   10     5 
post2   9     15 
post3   8     12 
post4   7     10 
post5   6     8 
post6   5     8 
post7   4     22 
post8   3     18 
post9   2     8 
post10   1     8 

La position Trending est mis à jour toutes les 4 heures et les clics sont remis à 0.

partir de ces données, je dois tirer les messages dans cet ordre

name   trending    clicks 
post6   5     22 
post8   3     18 
post2   9     15 
post3   8     12 
post4   7     10 
post5   6     8 
post9   2     8 
post10   1     8 
post1   10     5 

Voici un autre exemple :

name   trending    clicks 
post1   10     0 
post5   6     9 
post2   9     0 
post3   8     0 
post4   7     0 
post6   5     0 
post7   4     0 
post10   1     3 
post8   3     0 
post9   2     0 

J'ai besoin de trier ces résultats, sur la base des clics seulement si elles sont au-dessus de la tre position de départ. Exemple: Si le post 8 obtient plus de clics que la position 4, il prendra sa place et gardera l'ordre des tendances, mais utilisera les clics pour également commander les données.

Les messages d'origine conserveront leur position jusqu'à ce qu'un poste tendance ait obtenu plus de clics que la position pour prendre sa place.

Le problème que j'essaie de résoudre est lorsque je réinitialise les données de tendance. Je réinitialise les données toutes les 4 heures, mais je veux conserver les positions et les poids sur chaque poste tendance. Est-ce que je l'ai bien expliqué et si quelqu'un peut m'aider s'il vous plaît?

+0

ressemble à ce que vous voulez trier par clics pour moi. sinon, pourriez-vous fournir un exemple où ce n'est pas le cas. – pancho018

+0

J'ai mis à jour le message original avec un autre exemple pour le formatage. –

+0

pouvez-vous s'il vous plaît ajouter plus de balises - est ce serveur sql, mysql, oracle, etc? – Greg

Répondre

2

Pourquoi cela ne fonctionne pas pour vous? Mais si vous voulez conserver la tendance précédente, vous devez ajouter une colonne de poids. Au lieu de réinitialiser votre tendance toutes les 4h ne serait pas facile calculer les clics sur les 4 dernières heures. Vous devez enregistrer les données pour chaque clic

SELECT name, count(clicks) as clicks 
FROM YourTable 
WHERE datetime > DATEADD(h,-4,GETDATE()) 
GROUP BY name 
ORDER BY count(clicks) DESC 
+0

Excellente idée avec les clics + poids. J'essaie ça maintenant !!! Je ne parviens pas à utiliser un horodatage. Quand je fais cela, certains de ces postes ne bougeront jamais. Parfois, il y a des centaines de clics entre # 1 et # 2. J'espère qu'en redéfinissant souvent les posts, je donnerai aux autres posts une chance d'atteindre le sommet. –

+0

Une autre méthode consiste à utiliser une formule pour attribuer un poids à chaque clic, en fonction de l'âge du clic. Quelque chose comme 'ClickWeight = (1/number_of_second)', alors votre tendance est 'SUM (ClickWeight)' Le vrai travail ici est de trouver une fonction de poids appropriée. J'ai fait une fonction de trafic en temps réel une fois. Où chaque voiture au cours des 5 dernières minutes ont le même poids, mais après cela était une décroissance exponentielle.De cette façon, les données les plus récentes ont toujours plus de poids, mais si aucune donnée plus ancienne ne s'ajoute au résultat. –

+0

Yea, Juan. J'essaie de créer de nouvelles données capables de rivaliser avec des données plus anciennes. Exemple de SELECT * FROM test ORDER BY ((position + clics)/2) DESC fonctionne parfaitement! Je ne savais pas que je pouvais trier comme ça. Merci beaucoup!!!! –