Desarrollo de noticias al estilo de Facebook
-
14-11-2019 - |
Pregunta
Lo siento mucho si esta pregunta ya se ha formulado o respondido, pero parece que no puedo encontrar lo que necesito.
He construido todas las demás piezas de esto, mi única pregunta es sobre los comentarios en línea.Me gustaría hacer algo similar a lo que hace Facebook, donde muestran x comentarios con un botón para mostrar todos los y comentarios.
Sin embargo, las únicas dos formas que veo de hacer esto son:
- Realizar un SELECT en el bucle que representa cada elemento (creo que cualquiera que pueda tener una respuesta a esto estaría de acuerdo conmigo en que es una decisión terrible)
- Realizar una selección grande para extraer todos los comentarios donde news_id está en un subconjunto determinado y luego usar PHP para iterar sobre ellos, seleccionar la x más reciente e ignorar el resto.
Ninguna de ellas parece una buena solución;sin embargo, ambos implican un enorme desperdicio de recursos.
¿Alguien tiene alguna sugerencia potencial para implementar esto?
Solución
SELECT * FROM comments_table WHERE article_id = {something} LIMIT {no_of_comments_per_page} SORT BY date DESC
Esta es una consulta muy simple pero poderosa para los comentarios.
código real
<?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"]}";
}
?>
Otros consejos
Yo usaría un selecto con un límite agregado a la cláusula, ordenando por 'ID' en orden de DESC.Algo como .. "Seleccionar * de Comentarios Límite 3 DESC"
Cuando el usuario hace clic en el botón "Cargar más comentarios", realice algún tipo de solicitud AJAX con una consulta similar a ... "Seleccione * del límite de comentarios x, 3 DESC"
yo haría un JOIN
, y ordenar los datos después.Algo como:
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
El problema de rendimiento de tener comentarios adicionales que estarían ocultos es realmente insignificante, y no tiene la sobrecarga adicional de realizar una solicitud ajax para cargar los otros comentarios cuando hacen clic en el botón 'ver todo'; puede simplemente ocultarlos. y luego mostrarlos al instante.
Si solo quisieras las 40 publicaciones principales, tendrías que agregar esta condición a la cláusula donde (de hecho, también podrías ajustar cualquier filtrado que estés haciendo):
WHERE articles.id IN (SELECT id FROM articles ORDER by articles.date LIMIT 40)