Développement du fil d'actualités de style Facebook
-
14-11-2019 - |
Question
Je suis vraiment désolé si cette question a déjà été posée ou répondu, mais je ne semble pas tout à fait trouver ce dont j'ai besoin.
J'ai tous les autres éléments construits, ma seule question est des commentaires en ligne environnants. Je voudrais faire quelque chose de similaire à ce que fait Facebook où ils rendent x commentaires avec un bouton pour afficher tous les commentaires.
Cependant, les deux seules façons de voir de le faire sont:
- Effectuer un choix dans la boucle qui rend chaque élément (je pense que quiconque pourrait avoir une réponse à cela conviendrait avec moi qu'il s'agit d'une décision terrible)
- Effectuer un grand choix pour extraire tous les commentaires où News_id se trouve dans un certain sous-ensemble, puis utiliser PHP pour les itérer sur eux, sélectionner le X le plus récent et ignorer le reste.
Aucun de ces éléments ne semble être une bonne solution; Cependant, car ils impliquent tous les deux un énorme gaspillage de ressources.
Quelqu'un a-t-il une suggestion potentielle pour la mise en œuvre?
La solution
SELECT * FROM comments_table WHERE article_id = {something} LIMIT {no_of_comments_per_page} SORT BY date DESC
Il s'agit d'une requête très simple mais puissante pour les commentaires.
Code réel
<?php
$sql = "SELECT * FROM comments_table WHERE article_id = 24 LIMIT 40 SORT BY date DESC";
$data = mysql_query($sql);
$comments = mysql_fetch_assoc($data);
foreach($comments as $comment){
$ct++;
echo "ID: {$ct}";
echo "<br />";
echo "Comment: {$comment["comment"]} by {$comment["user"]}";
echo "Date: {$comment["date"]}";
}
?>
Autres conseils
J'utiliserais une sélection avec une limite ajoutée à la clause, commandant par «id» dans l'ordre desc. Quelque chose comme .. "Sélectionner * parmi les commentaires limite 3 desc"
Lorsque l'utilisateur clique sur le bouton "Chargez plus de commentaires", effectuez un certain type de demande Ajax avec une requête similaire à .. "Sélectionner * dans les commentaires Limit x, 3 desc"
Je ferais un JOIN
, et trier les données après. Quelque chose comme:
SELECT articles.id, articles.text, articles.date,
comments.id, comments.text, comments.date
FROM articles LEFT JOIN comments ON (comments.article_id = articles.id)
WHERE {some criteria} ORDER BY articles.date, comments.date
Le problème de performance d'avoir des commentaires supplémentaires qui seraient cachés est vraiment négligeable - et vous n'avez pas les frais généraux supplémentaires de faire une demande Ajax pour charger les autres commentaires lorsqu'ils cliquent sur ce bouton `` voir tout '' - vous pouvez simplement les cacher, puis les afficher instantanément.
Si vous ne vouliez que les 40 meilleurs messages, vous devrez ajouter cette condition à la clause Where (en fait, vous pourriez envelopper le filtrage que vous faites également):
WHERE articles.id IN (SELECT id FROM articles ORDER by articles.date LIMIT 40)