假设我有USERS
表,并且我想返回状态不等于10 USERS
的{{1}}。但是我想根据返回的行数对输出进行排序,例如如果返回的行数大于10,则我要ACTIVATED
,否则我要order by id
:
order by date created
请注意,我们需要在CASE语句中将id强制转换为INT,否则它会像字符串一样对id进行排序。
答案 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等。