假设我有一个像这样创建的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
只有可能的值为1
,0
和null
。
现在另外,我有一个500个ID的列表。我们称之为my_list
。它们位于由换行符分隔的文本文件中。该文件的名称为myfile.txt
。此文件中的条目太长,无法包含在SQL语句的单个where
子句中。
我想回答以下问题:
my_table
中有多少行,my_list
和my_boolean_field中的ID为空。my_table
中有多少行以及my_list
和my_boolean_field == 1中的ID。my_table
中有多少行以及my_list
和my_boolean_field == 0中的ID。my_table
中有多少行,my_list
和my_boolean_field中的ID为空。my_table
中有多少行和my_list
以及my_boolean_field == 1中的ID。my_table
中有多少行和my_list
以及my_boolean_field == 0中的ID。获得上述6个计数的最佳方法是什么?
答案 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表示假。
答案 1 :(得分: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个计数器。