2

ポーリングするいくつかのBashスクリプト用にMySQLに状態テーブルを実装することを考えていました。スクリプト#n-1の実行が終了し、その状態とステータスがMySQLデータベースの状態テーブルに書き込まれると、スクリプト#nが実行可能になります。基本的に、状態テーブルは次のようになります。

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

3 に答える 3

3

MySQLでは、フィールドだけでなく、フィールドの式や操作も選択できます。やや意外なことに、これは論理テストでも機能します。たとえば、where句で使用するようなものです。つまり、次のSQLを使用して、ブール(0/1)の結果を取得できます。

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

このSQLフィドルで試してみることができます。

最初は質問がわからなかったのが残念ですが、みんな理解していたようです:)

作成したクエリは、最大IDを選択せず​​、最大IDの行数を選択し、テーブルに少なくとも1つの行がある場合は、そのような値が存在するため、ほとんどの場合、常に1の値を返します。最大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

あなたもそのようにそれを行うことができます

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

そのように、SQLが2回チェックするのを防ぎます。

編集

  SELECT EXISTS(SELECT MAX(id) ,state , status FROM statetable WHERE state=2 AND status='OK' ) getIt from statetable 
于 2012-12-20T10:54:37.387 に答える
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 に答える