实施讨论

问题描述 投票:1回答:4

基于不同的条件组合,我处于一个可以从单个表中获取多个计数的位置。

该表有2个标志:A和B.

我想在同一页面上计算以下标准:

  1. A是真的(不关心B)
  2. A是假的(不关心B)
  3. A是真的,B是真的
  4. A是假的,B是真的
  5. A是真的,B是假的
  6. A是假的,B是假的
  7. B是真的(不关心A)
  8. B是假的(不关心A)

我希望以上所有内容都在同一页上。以下哪一项将是一个很好的方法:

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

我应该选择哪个选项?你知道其他任何替代方案吗?

sql
4个回答
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
投票

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


0
投票

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


0
投票

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

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

  1. 得到总数
  2. 真的(不关心B)
  3. B真(不关心A)
  4. A和B都是

'a true和B false'是第二减去第四,(A true) - (A和B true)。 'A和B false'=总计 - 真 - B真+ A和B真。寻找Inclusion exclusion principle获取更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.