MySql-如何根据返回的行数有条件地排序?

时间:2018-10-24 07:51:00

标签: mysql sql database

假设我有USERS表,并且我想返回状态不等于10 USERS的{​​{1}}。但是我想根据返回的行数对输出进行排序,例如如果返回的行数大于10,则我要ACTIVATED,否则我要order by id

order by date created

请注意,我们需要在CASE语句中将id强制转换为INT,否则它会像字符串一样对id进行排序。

2 个答案:

答案 0 :(得分:1)

创建一个视图,然后在您的count语句中使用它:

CREATE VIEW result AS
SELECT * FROM USERS
WHERE status != 'ACTIVATED'
ORDER BY 
  CASE 
    WHEN (SELECT COUNT(*) FROM result) > 10 THEN id
    ELSE created
  END
ASC
LIMIT 10

答案 1 :(得分:1)

您遇到语法错误,因此我迅速更正了您的查询,以减少麻烦。注意CASE条件及其多余的括号:

SELECT 
    * 
FROM USERS
WHERE 
    status != 'ACTIVATED'
ORDER BY
    CASE
        WHEN ((select count(ID) FROM USERS WHERE status != 'ACTIVATED') > 10) then id
        ELSE created
    END
    ASC
LIMIT 10

编辑:也同意为每个可以在其他(子)查询中组合的读取操作创建单独视图的做法。 即单独的视图:

CREATE VIEW 'my_view' as 
SELECT *
FROM USERS
WHERE 
    status != 'ACTIVATED'

通过利用视图,您可以进一步优化sql执行并使总体上更简单。当您需要将此类视图与其他更复杂的视图结合时,这一点尤其重要。

我迅速添加了一个视图语法的示例,因此它还没有准备就绪,也不是创建视图时要使用的模板。您将创建的大多数视图还定义了安全定义程序,调用程序,较早的mysql版本(以及mariadb和其他mysql分支)也表示是否使用sql_cache等。