2017-04-02 19 views
-1

と仮定MYSQL文でこれらGROUP_BYの統計情報を取得することができ、私はこのように作成されたMySQLのテーブルを持っている方法:私が最も効率的

CREATE TABLE `my_table` (
    `my_id` char(32) NOT NULL, 
    `my_boolean_field` tinyint(1) DEFAULT NULL, 
    PRIMARY KEY (`my_id`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

このテーブルは非常に大きいです。それには約1,000万行があります。 my_boolean_fieldの値は1,0nullです。

今は別に、私は500のIDのリストを持っています。これをmy_listとしましょう。それらは、改行で区切られたテキストファイル内にあります。そのファイルの名前はmyfile.txtです。このファイル内のエントリは、SQL文の単一のwhere句に含めるには長すぎます。

私は次の質問に答えたい:

  1. どのように多くのmy_tableの行があり、my_listにあり、my_boolean_fieldがnullのID。
  2. my_tableの行数とIDはmy_listで、my_boolean_field == 1です。
  3. my_tableの行数とmy_listとmy_boolean_field == 0にあるID。
  4. my_tableの行数とmy_listにないIDがあり、my_boolean_fieldがnullです。
  5. my_tableの行数とmy_listおよびmy_boolean_field == 1にないIDがあります。
  6. my_tableの行数とmy_listおよびmy_boolean_field == 0にないIDがあります。

上記の6つのカウントを得る最も効果的な方法は何ですか?

+0

テキストファイルをデータベースにテーブルとして読み込まないのはなぜですか?クエリは単純な結合になります。 –

+0

私に質問を表示します。 –

答えて

0

left joinと条件付き集計を使用して、必要なカウントを取得します。 sum

select 
sum(l.id is not null and t.my_boolean_field is null) 
,sum(l.id is not null and t.my_boolean_field =1) 
,sum(l.id is not null and t.my_boolean_field =0) 
,sum(l.id is null and t.my_boolean_field is null) 
,sum(l.id is null and t.my_boolean_field =1) 
,sum(l.id is null and t.my_boolean_field =0) 
from my_table t 
left join my_list l on l.id=t.my_id 

条件は、ブール値として扱い、偽のための真のための1と0を返すしています。

0
CREATE TABLE list (
    `my_id` char(32) NOT NULL 
); 

LOAD DATA INFILE ... -- get the 500 rows into `list`. 

SELECT 
    SUM(my_boolean_field IS NULL), 
    SUM(my_boolean_field = 0), 
    SUM(my_boolean_field = 1), 
    SUM(my_boolean_field IS NOT NULL), 
    SUM(my_boolean_field != 0), 
    SUM(my_boolean_field != 1) 
FROM tbl AS t 
JOIN list AS l ON t.my_id = l.my_id; 

6つのカウンターを並び替えて500回のルックアップを行います。

関連する問題