按观看次数排序,然后按其他列

时间:2017-10-23 16:02:51

标签: mysql sql mariadb sql-order-by limit

我有一个查询,从我的数据库按视图排序选择*并限制为4:

SELECT * FROM articles WHERE visible = 1 ORDER BY views LIMIT 4;

但在同一个查询中,我想找到按updated_at列排序的所有其他行。

我已尝试过这样的事情,但不起作用:

(SELECT * FROM articles ORDER BY views DESC LIMIT 4)
UNION
(SELECT * FROM articles ORDER BY updated_at DESC);

建议这是“固定”主页上的4篇最热门的文章,然后按时间排序更新。

有没有办法在同一个查询中多个ORDER BY而不重复行?

我该怎么做?

3 个答案:

答案 0 :(得分:2)

继续你当前的想法,我们可以采用两个子查询的联合。第一个子查询是您已经包含在问题中的内容,并查找了4篇经常查看的文章。第二个子查询找到其他所有内容。这里的技巧是在每个子查询中包含一个计算字段,我们可以使用它来跟踪其他所有内容中的前4个记录。然后,我们首先按此计算字段进行排序,然后依次为updated_at字段。

(
    SELECT a.*, 1 AS label
    FROM articles a
    WHERE visible = 1
    ORDER BY views DESC
    LIMIT 4
)
UNION ALL
(
    SELECT a.*, 2
    FROM articles a
    WHERE visible = 1
    ORDER BY views DESC
    LIMIT 1000000 OFFSET 4    -- the limit 1000000 is arbitrary; just use a number
)                              -- larger than the expected size of your table
ORDER BY
    label, views, updated_at

答案 1 :(得分:0)

您可以使用逗号分隔多个SampleCount + 1命令。 MySQL将从左到右订购。

ORDER

答案 2 :(得分:-1)

来自MySQL documentation

  

... UNION的默认行为是从结果中删除重复的行。 ......

  

...如果在SELECT中没有LIMIT出现ORDER BY,它会被优化掉,因为它无论如何都没有效果。 ...

所以这里的诀窍是在第二个查询中使用if event.key == pygame.K_s or event.key == pygame.K_w: y_change = 0 (由你来决定选择限制):

limit

该查询在MySQL 5.6和5.7中进行了测试。