混合来自用户提要的2个不同MySQL查询的结果



我想在一个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更改为每个块中带有特定标签的帖子的数量

相关内容

  • 没有找到相关文章

最新更新