2010-03-31 3 views
2

J'ai le tableau posts et posts_votes. En posts_votes j'ai id et post_id et vote. Maintenant, je veux choisir des postes où ont top vote compte dans le dernier 1 jour avec cette option pour régler le tempsComment sélectionner les meilleurs votes dans MySQL?

from_unixtime(post_date) >= SUBDATE(NOW(),1) 

Répondre

2

peut-être quelque chose comme ceci:

SELECT 
    posts.*, 
    pv.votes 
FROM 
    posts JOIN 
    (
     SELECT post_id, COUNT(*) AS votes FROM posts_votes GROUP BY post_id 
    ) AS pv ON posts.id=pv.post_id 
WHERE 
    posts.post_date >= UNIX_TIMESTAMP()-86400 
ORDER BY 
    pv.votes DESC; 
+0

ce que cela signifie des votes de posts_votes GROUP BY posts_votes –

+1

en fait c'est une faute de frappe, laissez-moi éditer rapidement et je vais vous expliquer –

+0

'UNIX_TIMESTAMP() - 86400' ne tient pas compte de l'heure d'été. Il est préférable d'utiliser les fonctions intégrées comme DATE_ADD ou SUBDATE() comme moustafa l'utilisait. –

2

En utilisant la clause GROUP BY vous permet de regrouper les données sur une colonne particulière sans avoir recours à une sous-requête ou à une table dérivée.

Cette requête renvoie tous les messages, classés par ordre vote compte par ordre décroissant:

SELECT p.* 
FROM posts p 
JOIN posts_votes pv 
ON pv.post_id = p.id 
WHERE FROM_UNIXTIME(p.post_date) >= SUBDATE(NOW(), 1) 
GROUP BY p.id 
ORDER BY COUNT(pv.post_id) DESC 

Si vous voulez limiter aux dix postes, vous pouvez ajouter la clause LIMIT:

SELECT p.* 
FROM posts p 
JOIN posts_votes pv 
ON pv.post_id = p.id 
WHERE FROM_UNIXTIME(p.post_date) >= SUBDATE(NOW(), 1) 
GROUP BY p.id 
ORDER BY COUNT(pv.post_id) DESC 
LIMIT 10 

MySQL peut être en mesure d'optimiser la comparaison de date, cependant, en général, essayez d'effectuer toutes vos fonctions sur la constante (le côté droit) au lieu de la colonne (le côté gauche).

Par exemple, vous devez changer ceci:

WHERE FROM_UNIXTIME(p.post_date) >= SUBDATE(NOW(), 1) 

à ceci:

WHERE p.post_date >= UNIX_TIMESTAMP(SUBDATE(NOW(), 1)) 

De cette façon, MySQL ne pas courir FROM_UNIXTIME() sur chaque ligne. Encore une fois, MySQL peut le réaliser et optimiser automatiquement, mais c'est la meilleure pratique.

Questions connexes