我正在运行一个社交网站,我正在寻找新的更聪明的方法来输出帖子。
数据库表示例:
id [INT]
message [LONGTEXT] Default NULL
attachment [VARCHAR] Default NULL
member_id [INT]
likes [INT] default 0
date [DATE]
etc
我知道这是一个非常模糊的例子,但我认为这足以提出这个问题。
我如何编写一个MySQL查询来输出仅包含附件的3个帖子(没有消息),然后是一个仅包含消息的帖子(没有附件),然后是6个帖子,其中“喜欢”的数量最多,然后重复这个过程,直到达到LIMIT?
我知道我可能要求很多,所以对此的任何变化都将受到高度赞赏。此外,任何相关内容的链接也会有很多帮助。非常感谢你。
答案 0 :(得分:0)
这是一种愚蠢的方法:
像@Kenney建议您可以使用union来合并3组。在应用union之前,我们需要以我们想要的方式对每个集合进行排序,并将row_id添加到每个集合中的每一行。申请结合后,我们可以通过
订购结果 type_id
,因此第一组中的前3个项目,第二组中的前1个项目以及第三组中的前6个项目评估为0.第一组中的下一个3个项目,第二个中的下一个项目设置,第三组中的下一个6项评估为1.依此类推。
SELECT *
FROM (
(SELECT *, @i:=@i+1 row_id, 1 type_id, 3 divisor
FROM mytable a
JOIN (SELECT @i := 0) b
WHERE attachment IS NOT NULL AND message IS NULL)
UNION ALL
(SELECT *, @j:=@j+1 row_id, 2 type_id, 1 divisor
FROM mytable a
JOIN (SELECT @j := 0) b
WHERE attachment IS NULL AND message IS NOT NULL)
UNION ALL
(SELECT *, @k:=@k+1 row_id, 3 type_id, 6 divisor
FROM mytable a
JOIN (SELECT @k := 0) b
WHERE !((attachment IS NOT NULL AND message IS NULL) OR (attachment IS NULL AND message IS NOT NULL))
ORDER BY likes DESC)) a
ORDER BY FLOOR(row_id/divisor), type_id;
,因此第一组出现在第三组之前的第二组之前
我很确定这是低效的。
Select Data