将
我想在一个NodeJS+MySQL
网站上做一个原始的个性化提要。现在我只选择所有有特定标签的文章:
SELECT column1, column2...
FROM table
WHERE tags = users_tags
ORDER BY relavance
LIMIT 8;
我还想加入一些流行的帖子,例如:
SELECT column1, column2...
FROM table
ORDER BY relevance
LIMIT 2;
我不想使用UNION,因为我想保留第一次选择的顺序,并为每5个帖子插入一个受欢迎的结果。如。:相关的,相关的,相关的,流行的,相关的…
现在,我有results1.concat(results2),它将它们作为最后两个添加,并返回它。然后我有一个for循环,通常会在前4次将其追加到HTML中,然后每5次从后面追加一次。
有更好的解决方案吗?
可以使用row_number来定义排序顺序
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 sortorder
您可以使用ROW_NUMBER()
窗口函数分别对具有特定标签的帖子和热门帖子进行排名,然后进行条件排序:
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;
将
4
更改为每个块中带有特定标签的帖子的数量