聪明的饲料结果| MySQL的

时间:2015-12-03 21:37:25

标签: mysql sql database

我正在运行一个社交网站,我正在寻找新的更聪明的方法来输出帖子。

数据库表示例:

id [INT]
message [LONGTEXT] Default NULL
attachment [VARCHAR] Default NULL
member_id [INT]
likes [INT] default 0
date [DATE]
etc

我知道这是一个非常模糊的例子,但我认为这足以提出这个问题。

我如何编写一个MySQL查询来输出仅包含附件的3个帖子(没有消息),然后是一个仅包含消息的帖子(没有附件),然后是6个帖子,其中“喜欢”的数量最多,然后重复这个过程,直到达到LIMIT?

我知道我可能要求很多,所以对此的任何变化都将受到高度赞赏。此外,任何相关内容的链接也会有很多帮助。非常感谢你。

1 个答案:

答案 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