2

我正在考虑在 MySQL 中为几个 Bash 脚本轮询实现一个状态表。这个想法是,一旦脚本#n-1完成运行并将其状态和状态写入 MySQL 数据库中的状态表,脚本#n就会被清除运行。基本上状态表看起来像:

+----+-------+--------+
| id | state | status |
+----+-------+--------+
| 44 |     2 |   OK   |
| 45 |     3 |   OK   |
| .. |   ... |  ...   |
| 55 |     2 |   OK   |
+----+-------+--------+

idauto_increment可用于定义最后一行。

目前我想出了:

#!/bin/bash
#...
VARIABLE=$(mysql mydbname --skip-column-names -s --local -e \
         "SELECT count(*) \
          FROM statetable \
          WHERE state=2 AND \
                status='OK' AND \
                id=(SELECT MAX(id) FROM statetable)")
if [ $VARIABLE -eq 1 ] ; then #...

是否有正确的方法来检查表中的最后一行是否具有所需的状态值和状态对(在上面的示例中为 2 和 OK)而不使用子查询并将该信息传递给 Bash 脚本?

添加的解决方案:

#!/bin/bash
function check_state () {
    VARIABLE=$(mysql mydbname --skip-column-names -s --local -e \
             "SELECT (state=2) && (status='OK') \
              FROM statetable \
              ORDER BY id DESC \
              LIMIT 1;")
    return $VARIABLE
}

if ! check_state ; then #...
4

3 回答 3

3

在 MySQL 中,您不仅可以选择字段,还可以选择表达式和对它们的操作。有点令人惊讶的是,这也适用于逻辑测试,我们使用的那种,例如在一个where子句中。这意味着您可以使用以下 SQL 来获得布尔 (0 / 1) 结果:

select (state = 2) && (status = 'OK')
from statetable
order by id desc
limit 1

你可以在这个SQL Fiddle上试一试。

抱歉,我一开始没有理解这个问题,但似乎每个人都理解了:)

你写的查询很可能总是返回值 1,因为它不选择最大 id,它选择最大 id 的行数,如果表中至少有一行,就有这样的作为最大 id 的东西 :)

假设您需要最后一个 ID,更好的方法(没有子查询)是对数据进行排序,然后只取第一行,例如:

SELECT id FROM statetable 
WHERE state=2 
  AND status='OK' 
ORDER BY ID DESC
LIMIT 1

于 2012-12-20T10:55:12.917 回答
0

我的建议是,

VARIABLE=$(mysql mydbname --skip-column-names -s --local -e "SELECT MAX(id) ,state , status FROM statetable WHERE state=2 AND status='OK'")
if [ $VARIABLE -nq 0 ] ; then #...
于 2012-12-20T10:57:37.953 回答
0

你也可以那样做

  SELECT MAX(id) ,state , status FROM statetable WHERE state=2 AND status='OK' 

像那样你阻止sql检查两次,

编辑

  SELECT EXISTS(SELECT MAX(id) ,state , status FROM statetable WHERE state=2 AND status='OK' ) getIt from statetable 
于 2012-12-20T10:54:37.387 回答