2017-04-02 25 views
-1

假設獲得這些GROUP_BY統計我有一個像這樣創建MySQL表:我怎樣才能最有效地在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; 

此表是非常大的。它有大約1000萬行。 my_boolean_field唯一可能的值是10null

現在分開,我有一個500個ID的列表。我們稱之爲my_list。它們位於由換行符分隔的文本文件中。該文件的名稱是myfile.txt。此文件中的條目太長,無法包含在SQL語句的單個where子句中。

我要回答以下問題:

  1. 多少在my_table行已經和ID是在my_list和my_boolean_field爲空。
  2. my_table中有多少行的ID爲my_list,my_boolean_field == 1。
  3. 多少在my_table行已經和ID是在my_list和my_boolean_field == 0。
  4. my_table中的行數有多少,並且ID不在my_list且my_boolean_field爲空。
  5. my_table中的行數有多少,並且ID不在my_list和my_boolean_field == 1中。
  6. my_table中有多少行具有不在my_list和my_boolean_field == 0中的ID。

什麼是最高效的方式獲得上述6個計數?

+0

爲什麼不把文本文件作爲表加載到數據庫中?那麼查詢將是一個簡單的連接。 –

+0

向我顯示查詢。 –

回答

0

使用left join和有條件的聚集,以獲得所需計數。

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 

sum中的條件被視爲布爾值,返回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; 

它將執行500次查找,計數6個計數器。