Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查MySQL表中的最后一行是否具有所需的值?_Mysql_Sql_Bash - Fatal编程技术网

如何检查MySQL表中的最后一行是否具有所需的值?

如何检查MySQL表中的最后一行是否具有所需的值?,mysql,sql,bash,Mysql,Sql,Bash,我正在考虑在MySQL中为几个Bash脚本实现一个状态表以进行轮询。其思想是,一旦脚本n-1完成运行并将其状态写入MySQL数据库中的状态表中,脚本n就会被清除以运行。状态表基本上如下所示: +----+-------+--------+ | id | state | status | +----+-------+--------+ | 44 | 2 | OK | | 45 | 3 | OK | | .. | ... | ... | | 55 |

我正在考虑在MySQL中为几个Bash脚本实现一个状态表以进行轮询。其思想是,一旦脚本n-1完成运行并将其状态写入MySQL数据库中的状态表中,脚本n就会被清除以运行。状态表基本上如下所示:

+----+-------+--------+
| id | state | status |
+----+-------+--------+
| 44 |     2 |   OK   |
| 45 |     3 |   OK   |
| .. |   ... |  ...   |
| 55 |     2 |   OK   |
+----+-------+--------+
id列是自动递增的,因此可用于定义最后一行

现在我想到了:

#!/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 #...

你也可以这样做

  SELECT MAX(id) ,state , status FROM statetable WHERE state=2 AND status='OK' 
就像你阻止sql检查两次一样

编辑


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

select (state = 2) && (status = 'OK')
from statetable
order by id desc
limit 1
你可以试试这个

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

您编写的查询很可能总是返回值1,因为它不选择最大id,而是选择具有最大id的行数,如果表中至少有一行,则存在最大id:

假设您需要最后一个ID,没有子查询的更好方法是对数据排序,只取第一行,类似于:

SELECT id FROM statetable 
WHERE state=2 
  AND status='OK' 
ORDER BY ID DESC
LIMIT 1
我的建议是,

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 #...

我会选择他们的描述ID和限制2。这将为您提供2行-第二行将保存所有数据,以便对照另一行进行检查下一个要运行的作业在下一步中,我们需要检查变量是否不等于0。因为他是sql的新手,我只是指导他。。没有问题。不管最后一行是不是最后一行,它都会返回最后一对2和OK?因为它是按ID DESC排序的,所以最后一对2和OK的行将具有最大ID,这是您想要的。不,我正在尝试检查表中的最后一行是否具有所需的状态和状态。如果这是条件,则它可以工作,但如果最后已知的状态和状态为例如1和OK,则查询将返回2和OK的最后一个实例。啊哈,我猜我看错了问题,将很快更新答案。这将返回状态和状态为2和OK的最大id。我需要检查最后一个状态和状态是否为2和ok。如果最后一个id为2和ok,那么你会怎么做?如果它们正确,如果脚本2已成功结束状态=2,则执行状态='OK'脚本3。因此,我需要检查状态表中的最后一行,看看它是否为2和OK。因为我不打算在每个脚本之后都清理表,所以我不能依赖你的解决方案,这实际上是我第一次尝试标题。你不能用php或bash或其他方法检查它吗?如果然后你想跑什么就跑什么,否则。。。。。
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 #...