2016-05-29 7 views
0

"info"という名前の1列のテーブルがあり、内容は{"Twitter": 28, "Total": 28, "Facebook": 1}です。私はSQLを書くとき、私は "合計"が10より大きいかどうかをテストしたい。誰かが私に質問を書くのを手伝ってもらえますか?{"Twitter":28、 "Total":28、 "Facebook":1}

SELECT * FROM landslides_7d WHERE info.Total > 10; 

おかげで(これは私が持っているものである)

(テーブル名はlandslides_7dです)。

+0

「テストしたい」と言うと、正確にはどういう意味ですか? 'Total'が> 10であるすべての行のリスト*を欲しいですか?または、そこにいくつの行があるのか​​?または、ある行が与えられた場合、その行がこの基準に一致するかどうかを「真偽」値にしますか? –

+0

合計が10より大きいすべての行のリストが必要です。 –

+0

テーブルには少なくとも2つの列が必要です。 JSONツールやAPIジェネレータを使用してデータを抽出していますか? –

答えて

0

おそらく、JSONを単一のBLOBまたは文字列に格納しているとします。これは非常に非効率です。なぜなら、インデックスを使用することができず、どこのクエリでもJSON構造全体を解析する必要があるからです。 JSONの属性が比較的固定されている場合は、テーブルの内容にスクリプト(ルビー、Pythonなど)を実行し、従来の列形式で「合計」を格納することをお勧めします。たとえば、合計属性をINTとして含む新しい列「total」を追加することができます。

スクリプトを使用することの副次的なメリットは、不適切な形式のJSONを捕捉できることです。これは、単一のクエリでは実行できないものです。

@johannes answerで参照されているJSON_EXTRACT関数を使用して、 "total"列をトリガー( "info"の更新/挿入時)で維持することもできます。

+0

'JSON_EXTRACT'が利用可能な場合は、MySQL 5.7で動作する可能性が最も高いです。次に、手動トリガーの代わりに生成された列を使用して、必要な記憶域が少なくて済み(インデックスのみが格納されています)、信頼性があります(データベースは目的を理解しています)。 http://mysqlserverteam.com/generated-columns-in-mysql- 5-7-5 / – johannes

1

データ形式はJSONのようです。 MySQL 5.7をお持ちの場合は、JSON_EXTRACTまたは短い形式->を使用できます。これらの関数は古いバージョンには存在しません。

SELECT * FROM landslides_7d WHERE JSON_EXTRACT(info, '$.total') > 10; 

または

SELECT * FROM landslides_7d WHERE info->total > 10; 

これは、全表スキャンであることをhttp://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html#function_json-extract

マインドを参照してください。 「大きい」表では、索引を作成します。

古いバージョンのMySQLを使用している場合は、テーブルに余分な列を作成し、手動で合計値をその列に追加する必要があります。