Quiero hacer un feed personalizado primitivo en un sitio web NodeJS+MySQL . Ahora solo selecciono todas las publicaciones que tienen etiquetas específicas:
SELECT column1, column2... FROM table WHERE tags = users_tags ORDER BY relavance LIMIT 8;También quiero incluir un par de publicaciones populares, por ejemplo:
SELECT column1, column2... FROM table ORDER BY relevance LIMIT 2;No quiero usar UNION porque quiero conservar el orden de mi primera selección e insertar un resultado popular para cada quinta publicación. Ej.: relevante, relevante, relevante, relevante, popular, relevante...
Por ahora, tengo results1.concat(results2) que los agrega como los dos últimos y los devolvió. Luego tuve un ciclo for que agregaría el HTML normalmente para los primeros 4 y luego uno desde atrás para cada 5.
¿Hay alguna solución mejor?
Lo que podría usar, es row_number para definir el orden de clasificación
SELECT column1,column2 FROM (SELECT column1,column2,IF(rn = 1, B,D) as sortorder FROM (SELECT column1, column2, ROW_NUMBER() OVER(ORDER BY relavance) rn FROM table1 ORDER BY relavance LIMIT 2) t1 UNION SELECT column1,column2,IF(rn < 5, A,C) as sortorder FROM (SELECT column1, column2, ROW_NUMBER() OVER(ORDER BY relavance) rn FROM table1 WHERE tags = users_tags ORDER BY relavance LIMIT 8) t2) t3 ORDER BY sortorderPuede usar la función de ventana ROW_NUMBER() para clasificar por separado las publicaciones con etiquetas específicas y las publicaciones populares y luego hacer una ordenación condicional:
WITH cte AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY tags = users_tags ORDER BY relevance) rn FROM tablename ) SELECT * FROM cte ORDER BY CASE WHEN tags = users_tags THEN rn + FLOOR((rn - 1) / 4) ELSE (4 + 1) * rn END LIMIT 10; Cambie 4 a la cantidad de publicaciones con etiquetas específicas que desea en cada bloque.
Vea una demostración simplificada.