执行讨论

问题描述:

我处于一个位置,我希望根据不同的条件组合从单个表中进行多次计数。执行讨论

表有2个标志:一个& B.

我想计数以下同一页上的标准:

  1. A是真实的(不要在意B)
  2. A是假(不要在意B)
  3. A为真,B是真
  4. A假B真
  5. A为真AN DB是假
  6. A是假的,B是假的
  7. B为真(不要在意A)
  8. B是假的(不要在意A)

我希望所有以上统计在同一页面上。以下哪一种方法适用于此:

  1. 查询每个条件下该表的计数。 [每次用户发出命令时触发8次查询。]
  2. 查询数据库中的数据列表,然后在UI上为适当的条件计数值。

我应该选择哪一个选项?你知道这个有什么其他的选择吗?

+0

桌子有多大? –

+0

目前,我正在500行左右,如果我查询没有任何一个用户的国旗条件。 –

你的表基本上看起来像这样(ID列是多余的,但我希望你在你的实际表中的其它数据反正。):

CREATE TABLE `stuff` (
    `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `a` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0', 
    `b` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`) 
) 

一些样本数据:

INSERT INTO `stuff` (`id`, `a`, `b`) VALUES (1, 0, 0); 
INSERT INTO `stuff` (`id`, `a`, `b`) VALUES (2, 0, 1); 
INSERT INTO `stuff` (`id`, `a`, `b`) VALUES (3, 1, 0); 
INSERT INTO `stuff` (`id`, `a`, `b`) VALUES (4, 1, 1); 

这个查询(在MySQL中,我不确定其他DBMS)应该产生你想要的结果。

select 
count(if (a = 1,    1, NULL)) as one, 
count(if (a = 0,    1, NULL)) as two, 
count(if (a = 1 && b = 1, 1, NULL)) as three, 
count(if (a = 0 && b = 1, 1, NULL)) as four, 
count(if (a = 1 && b = 0, 1, NULL)) as five, 
count(if (a = 0 && b = 0, 1, NULL)) as six, 
count(if (b = 1,    1, NULL)) as seven, 
count(if (b = 0,    1, NULL)) as eight 
from stuff 
group by null 

与样品,上述简单的数据,查询生成:

 
one, two, three, four, five, six, seven, eight 
2 , 2 , 1,  1, 1, 1, 2,  2 

注:

 
group by null 

这只是导致每行的RO是在组中。

 
count(...) 

该函数计算组中所有非空值,这就是为什么我们使用if(...)在条件不满足时返回null的原因。

创建一个已经进行计数的查询。至少在SQL中,这并不难。

+0

我不擅长查询数据库。你会展示一个如何在单个查询中获取所有计数的示例吗? –

+0

@mark - 如果你要求人们解决你的SQL问题,你就不会为自己写SQL了! –

+0

@Stephen:这就是为什么我要求***样本***查询而不是解决方案查询。 –

在我看来,第二种选择更好,因为你只查询一次。向数据库发射8个查询可能会影响性能。

+0

就像提取所有数据100万行... –

数据库旨在为您提供所需的数据。在几乎所有情况下,询问你想要什么,比询问一切并计算或过滤自己要快。我会说,你应该盲目地去选择1(问你需要什么),如果它真的不行,考虑选项2(或别的东西)。

如果每个标志都是真或假(无空值)。您不需要8个查询,4个就足够了。

  1. 得到总
  2. 一个真正的(不关心B)
  3. 乙真(不关心A)
  4. A和B真

“A真和B假'是第二减四,(A真) - (A和B真)。而'A和B错误'=总数 - 一个真正的B真+ A和B真。查找Inclusion exclusion principle了解更多信息。