我有一个查询,从我的数据库按视图排序选择*并限制为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而不重复行?
我该怎么做?
答案 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中进行了测试。