【问题标题】:MySQL - select rows with limitMySQL - 选择有限制的行
【发布时间】:2018-06-13 21:15:03
【问题描述】:

如何根据条件(使用IN 或任何其他条件)选择一定数量的行,如果条件返回的行数小于LIMIT x,则从剩余的行中进行选择行直到遇到LIMIT x

所以,如果我有下表:

id   comment   ord
1    ...       null
2    ...       1
3    ...       2
4    ...       null

那么结果集应该是,使用LIMIT 3:

id   comment   ord
2    ...       1
3    ...       2
1    ...       null

如果ord 列不为空,那么我想选择相应的行,如果不是,我想从其余行中选择一个或多个,具有ord NULL,直到达到LIMIT 3 条件。

另一个例子,如果我有下一个表数据:

id   comment   ord
1    ...       3
2    ...       1
3    ...       2
4    ...       null

那么结果集应该是

id   comment   ord
2    ...       1
3    ...       2
1    ...       3

我试过这个mysql代码:

SELECT t.* FROM table t 
WHERE 
    t.ord IN (SELECT t1.ord FROM table t1 WHERE t1.ord IS NOT NULL ORDER BY t1.ord ASC) 
    OR 
    t.id IN (SELECT t2.id FROM table t2 WHERE t2.ord IS NULL ORDER BY t2.id ASC)
LIMIT 3;

但我总是得到具有ord NULL 的行,即使我有一些ord 列不为空。

有什么帮助吗?

【问题讨论】:

  • 添加 order by 子句?
  • @SamiKuhmonen 嗯,我不太了解你...
  • 您从数据库中请求三个随机行。如果您首先想要 ord 不为空的那些,然后添加一个 ODER BY 表示您首先想要它们
  • @SamiKuhmonen 我这样做了,但结果集是相同的,忽略了 ord 不为空的那些。

标签: mysql select subquery


【解决方案1】:

在您的ORDER BY 中检查ord 是否为空:

SELECT *
FROM table
ORDER BY ord IS NULL, ord, id
LIMIT 3

ord IS NULL 对于非空 ord 将是 0,对于空 1 将是 ord,因此这会将所有非空行放在首位。其中,它将按ord 订购,其余的将按id 订购。

然后LIMIT 3 将选择所有这些中的前 3 个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    相关资源
    最近更新 更多