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.
ce que cela signifie des votes de posts_votes GROUP BY posts_votes –
en fait c'est une faute de frappe, laissez-moi éditer rapidement et je vais vous expliquer –
'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. –