两个特定记录

时间:2015-06-05 13:47:02

标签: php mysql mysqli

有没有办法在特定记录中将MYSQL使用的默认顺序设置为NULL。

我的桌子:

id     state
1       downloading
2       NULL
3       error
4       finish
5       downloading
6       NULL
7       NULL
8       fail
9       finish
10      error

我希望NULL介于'下载'和'错误'并且不显示'完成','失败'。 (在MYSQL中查询之后)我希望结果如下:

id     state
1       downloading
5       downloading
2       NULL
6       NULL
7       NULL
3       error
10       error

我的疑问:(不工作)

SELECT * FROM `report_table` 
WHERE
    state NOT IN ('finish','fail')
ORDER BY
    case 
       when state= 'downloading' then 1 
       when state IS NULL then 2
       when state= 'error' then 3
       else 6
    end, state ASC , id ASC
LIMIT 1

4 个答案:

答案 0 :(得分:1)

通常,SQL允许您对所需的任何表达式进行ORDER BY。这不是仅提供列名称的​​必要条件。因此,您可以设计表达式,根据需要订购数据。假设我们选择“下载”和“错误”之间的魔术值“dzzzzz”。然后写下

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
    <persistence-unit name="myUnit">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:/YourDatasource</jta-data-source>

        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.show_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>

但要小心 - MySQL在这些方面并不是很有效。

答案 1 :(得分:0)

您可以执行以下操作:

SELECT * FROM `table`
ORDER BY 
    FIELD(IFNULL(state, 'null'), 'downloading', 'null', 'error', 'fail', 'finish');

在这种情况下,我们使用FIELD函数 - https://dev.mysql.com/doc/refman/5.5/en/string-functions.html#function_field

答案 2 :(得分:0)

您可以在CASE子句中使用ORDER BY表达式:

SELECT id, state
FROM mytable
ORDER BY CASE WHEN state = 'downloading' THEN 'aa'
              WHEN state IS NULL THEN 'ab'
              ELSE state
         END, id

这种方式首先是'downloading'条记录,然后是NULL条记录,其次是其他记录。

Demo here

答案 3 :(得分:0)

这应该可以,因为您可以为所需的案例分配自定义顺序,其余的将默认排序。

order by 
        case 
           when state= 'downloading' then 1 
           when state IS NULL then 2
           when state= 'error' then 3
           when state= 'fail' then 4
           when state= 'finish' then 5
           else 6
        end