执行讨论
我处于一个位置,我希望根据不同的条件组合从单个表中进行多次计数。执行讨论
表有2个标志:一个& B.
我想计数以下同一页上的标准:
- A是真实的(不要在意B)
- A是假(不要在意B)
- A为真,B是真
- A假B真
- A为真AN DB是假
- A是假的,B是假的
- B为真(不要在意A)
- B是假的(不要在意A)
我希望所有以上统计在同一页面上。以下哪一种方法适用于此:
- 查询每个条件下该表的计数。 [每次用户发出命令时触发8次查询。]
- 查询数据库中的数据列表,然后在UI上为适当的条件计数值。
我应该选择哪一个选项?你知道这个有什么其他的选择吗?
你的表基本上看起来像这样(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中,这并不难。
我不擅长查询数据库。你会展示一个如何在单个查询中获取所有计数的示例吗? –
@mark - 如果你要求人们解决你的SQL问题,你就不会为自己写SQL了! –
@Stephen:这就是为什么我要求***样本***查询而不是解决方案查询。 –
在我看来,第二种选择更好,因为你只查询一次。向数据库发射8个查询可能会影响性能。
就像提取所有数据100万行... –
数据库旨在为您提供所需的数据。在几乎所有情况下,询问你想要什么,比询问一切并计算或过滤自己要快。我会说,你应该盲目地去选择1(问你需要什么),如果它真的不行,考虑选项2(或别的东西)。
如果每个标志都是真或假(无空值)。您不需要8个查询,4个就足够了。
- 得到总
- 一个真正的(不关心B)
- 乙真(不关心A)
- A和B真
“A真和B假'是第二减四,(A真) - (A和B真)。而'A和B错误'=总数 - 一个真正的B真+ A和B真。查找Inclusion exclusion principle了解更多信息。
桌子有多大? –
目前,我正在500行左右,如果我查询没有任何一个用户的国旗条件。 –