Mysql 从具有单列的表中删除除前N行以外的所有行

Mysql 从具有单列的表中删除除前N行以外的所有行,mysql,Mysql,我只需要一个问题。删除表中除前N行以外的所有行。该表只有一列。像 |friends_name| ============== | Arunji | | Roshit | | Misbahu | | etc... | 此列也可能包含重复的名称 包含重复的名称 只有一列 如果您没有id字段,我想您使用的是字母顺序 MYSQL 如果您可以按朋友的姓名对记录进行排序,并且如果没有重复的记录,您可以使用以下方法删除除10个第一字母以外的所有行: DELETE FROM na

我只需要一个问题。删除表中除前N行以外的所有行。该表只有一列。像

|friends_name|
==============
| Arunji     |
| Roshit     |
| Misbahu    |
| etc...     |
此列也可能包含重复的名称

包含重复的名称

只有一列


如果您没有id字段,我想您使用的是字母顺序

MYSQL
如果您可以按朋友的姓名对记录进行排序,并且如果没有重复的记录,您可以使用以下方法删除除10个第一字母以外的所有行:

DELETE FROM names
WHERE
  friends_name NOT IN (
    SELECT * FROM (
      SELECT friends_name
      FROM names
      ORDER BY friends_name
      LIMIT 10) s
  )
DELETE FROM names ORDER BY friends_name DESC
LIMIT total_records-10
请看小提琴

或者,您可以使用:

DELETE FROM names
WHERE
  friends_name NOT IN (
    SELECT * FROM (
      SELECT friends_name
      FROM names
      ORDER BY friends_name
      LIMIT 10) s
  )
DELETE FROM names ORDER BY friends_name DESC
LIMIT total_records-10

如果total_records是SELECT COUNT*FROM names,但您必须通过代码执行此操作,您不能在查询的LIMIT子句中输入计数。

我只想继续回答这个相对较老的问题,因为现有的答案没有捕获要求和/或不正确。该问题说明名称可以重复,但必须只保留前N个。其他答案将删除不正确的行和/或不正确的行数

例如,如果我们有此表:

|friends_name|
==============
| Arunji     |
| Roshit     |
| Misbahu    |
| Misbahu    |
| Roshit     |
| Misbahu    |
| Rohan      |
我们希望删除除前3行N=3以外的所有行,预期结果为:

|friends_name|
==============
| Arunji     |
| Roshit     |
| Misbahu    |
当前选定答案中的DELETE语句将导致:

|friends_name|
==============
| Arunji     |
| Misbahu    |
| Misbahu    |
| Misbahu    |
看这个。原因是它首先按字母顺序对名字进行排序,然后取前3名,然后删除所有不相等的名字。但由于它们是按名称排序的,所以它们可能不是我们想要的前三名,也不能保证我们最终只会得到三名

在没有唯一索引和其他字段来确定top N的含义时,我们按照数据库返回的顺序进行操作。无论数字多高,我们都可能尝试使用类似的替代品99999:

DELETE FROM names LIMIT 99999 OFFSET 3
但是根据,尽管DELETE支持LIMIT子句,但它不支持OFFSET。因此,按照请求在单个查询中执行此操作似乎是不可能的;我们必须手动执行这些步骤

解决方案1-临时桌子容纳前3名 这是供参考的报告

解决方案2-具有重命名的新表 这是这一个的答案

在这两种情况下,我们最终得到原始表中的前3行:

|friends_name|
==============
| Arunji     |
| Roshit     |
| Misbahu    |

你没有id字段???@ImaneFateh没有。。没有id字段。你能颠倒顺序,把前面的N作为最后的N吗?如果是这样的话,你可以使用limit…看不见小提琴。如果你在@fthiella解释它,这将是完全有帮助的。我不明白为什么选择*从。。。是否使用了?@Sp4Rx双子查询是一种解决方法,因为mysql不允许在子查询中使用限制
|friends_name|
==============
| Arunji     |
| Roshit     |
| Misbahu    |