Mysql按前两名排序,然后是id

Mysql按前两名排序,然后是id,mysql,Mysql,我想显示前两个排名靠前的帖子,然后是其他按id排序的帖子 这是一张桌子 +----+-------+--------------+--------+ | Id | Name | Post | Votes | +====+=======+==============+========+ | 1 | John | John's msg | -6 | | 2 |Joseph |Joseph's msg | 8 | | 3 | Ivan | Ivan

我想显示前两个排名靠前的帖子,然后是其他按id排序的帖子

这是一张桌子

+----+-------+--------------+--------+
| Id | Name  | Post         | Votes  |
+====+=======+==============+========+
| 1  | John  | John's msg   | -6     |
| 2  |Joseph |Joseph's msg  | 8      |
| 3  | Ivan  | Ivan's msg   | 3      |
| 4  |Natalie|Natalie's msg | 10     |
+----+-------+--------------+--------+
查询结果后应为:

    +----+-------+--------------+--------+
    | Id | Name  | Post         | Votes  |
    +====+=======+==============+========+
    | 4  |Natalie|Natalie's msg | 10     |
    | 2  |Joseph |Joseph's msg  | 8      |
-----------------------------------------------
    | 1  | John  | John's msg   | -6     |
    | 3  | Ivan  | Ivan's msg   | 3      |
    +----+-------+--------------+--------+
我有一个解决方案,但我觉得有更好更快的方法。 我运行了两个查询,一个用于获取前2个查询,然后第二个用于获取其他查询:

SELECT * FROM table order by Votes desc LIMIT 2

SELECT * FROM table order by Id desc
然后在PHP中,我确保第一个查询按原样显示,在显示第二个查询时,我删除第一个查询中的条目,这样它们就不会重复。
这是否可以在单个查询中完成,以选择前两个投票最多的查询,然后选择其他查询?

您必须使用子查询或联合查询-这意味着您有一个外部查询,其中包含多个内部查询。我只需从第一个查询中检索id,并在第二个查询的where子句中添加一个id not in(…)条件,从而过滤掉在第一个查询中检索到的帖子:

SELECT * FROM table WHERE Id NOT IN (...) ORDER BY Id DESC
查询的结果如下所示:

(SELECT table.*, 1 as o FROM table order by Votes desc LIMIT 2)
UNION
(SELECT table.*, 0 FROM table
    WHERE Id NOT IN (SELECT Id FROM table order by Votes desc LIMIT 2))
ORDER BY o DESC, if(o=1,Votes,Id) DESC
正如您所看到的,它将3个查询打包成一个查询,并且具有更复杂的顺序,因为在
union
中,检索到的记录的顺序没有保证


在这种情况下,两个简单的查询对我来说似乎效率更高。

可以用不同的方法编写一个查询,按照您想要的顺序返回行。我的解决办法是:

select
  table.*
from
  table left join (select id from table order by votes desc limit 2) l
  on table.id = l.id
order by
  case when l.id is not null then votes end desc,
  tp.id
子查询将返回按票数desc排序的前两个id,只要该行是前两个id中的一个,则联接将成功,否则l.id将改为null


order by将按票数排序desc,无论何时行是第一行还是第二行(=l.id不为null),当l.id为null时,它将把行放在底部,然后按id排序。

我认为MySQL不支持子查询中的限制,但可以使用联接instead@fthiella请查看联盟上的链接。它说的不是:)是的,问题不在支持限制的联合查询上,而是在不支持限制的
不在(选择…限制2)