我处在一个位置,根据不同的条件组合,我希望从一张表中获得多个计数。
该表有两个标志:A&乙
我想在同一页上计算以下条件:
我希望以上所有内容都在同一页面上。以下哪一项将是一个很好的方法:
我应该选择哪个选项?你知道其他任何替代方案吗?
答案 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个就足够了。
'a true和B false'是秒减去第四,(A true) - (A和B true)。 'A和B false'=总计 - 真 - B真+ A和B真。有关详细信息,请查找Inclusion exclusion principle。