实施讨论

时间:2011-08-25 10:07:57

标签: sql

我处在一个位置,根据不同的条件组合,我希望从一张表中获得多个计数。

该表有两个标志:A&乙

我想在同一页上计算以下条件:

  1. A是真的(不关心B)
  2. A是假的(不关心B)
  3. A是真的,B是真的
  4. A是假的,B是真的
  5. A为真且B为假
  6. A为假,B为假
  7. B是真的(不关心A)
  8. B是假的(不关心A)
  9. 我希望以上所有内容都在同一页面上。以下哪一项将是一个很好的方法:

    1. 查询每个条件对该表的计数。 [每次用户发出命令时都会触发8个查询。]
    2. 查询数据库中的数据列表,然后在UI上计算适当条件的值。
    3. 我应该选择哪个选项?你知道其他任何替代方案吗?

4 个答案:

答案 0 :(得分:3)

你的表基本上是这样的(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

这只会导致每一行都在该组中。

count(...)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

在我看来,第二个选项更好,因为你只查询一次。将8个查询发送到DB可能会影响性能。

答案 3 :(得分:0)

数据库旨在为您提供所需的数据。在几乎所有情况下,询问你想要什么,比要求所有事情并计算或过滤自己更快。我会说,你应该盲目地选择选项1(问你需要什么),如果它真的不起作用,请考虑选项2(或其他)。

如果每个标志都为true或false(没有空值。)您不需要8个查询,4个就足够了。

  1. 获取总数
  2. 真实(不关心B)
  3. B true(不关心A)
  4. A和B true
  5. 'a true和B false'是秒减去第四,(A true) - (A和B true)。 'A和B false'=总计 - 真 - B真+ A和B真。有关详细信息,请查找Inclusion exclusion principle