我正在考虑在MySQL中实现一个状态表,以便轮询几个Bash脚本。这个想法是脚本 #n 在脚本#n-1 运行完毕后被清除,并将其状态和状态写入MySQL数据库的状态表中。基本上状态表看起来像:
+----+-------+--------+
| id | state | status |
+----+-------+--------+
| 44 | 2 | OK |
| 45 | 3 | OK |
| .. | ... | ... |
| 55 | 2 | OK |
+----+-------+--------+
id
列为auto_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 #...
答案 0 :(得分:2)
在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
答案 1 :(得分: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
答案 2 :(得分: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 #...