【问题标题】:Precalculate numbers of records for each possible combination预先计算每个可能组合的记录数
【发布时间】:2019-12-30 18:51:22
【问题描述】:

我有一个包含手机信息的 mySQL 数据库表,如下所示:

ID   Brand   Model  Price Type   Size
==== =====   =====  ===== ====== ====
1    Apple   A71    3128  A      40
2    Samsung B7C    3128  B      20
3    Apple   ZX5    3128  A      30
4    Huawei  Q32    2574  B      40
5    Apple   A21    2574  A      25
6    Apple   A71    3369  A      30
7    Samsung A71    7413  C      40

现在我想创建另一个表,其中包含每个可能的参数组合的计数。

Params                                         Count  
============================================== =======  
ALL                                            1000000
Brand(Apple)                                   20000
Brand(Apple,Samsung)                           40000
Brand(Apple),Model(A71)                        7100
Brand(Apple),Type(A)                           6000
Brand(Apple),Model(A71,B7C),Type(A,B)          7
Model(A71)                                     12514
Model(A71,B7C)                                 26584
Model(A71),Type(A)                             6521
Model(A71),Type(A,B)                           8958
Model(A71),Type(A,B),Size(40)                  85

对于每一种可能的组合,依此类推。我正在考虑创建一个存储过程(我会定期执行),它将对每个现有条件执行查询,但我对它应该是什么样子有点卡住。或者有没有更好的方法来做到这一点?

编辑:我想这样存储信息的原因是能够在客户端应用程序的过滤器中显示结果数量,如图所示。

我想在Params 列上创建索引,以便能够立即获取给定哈希的Count 数字,从而提高性能。

我也尝试过动态查询和缓存值,但我也想尝试这种方法,这样我可以比较哪个更有效。

这就是我现在计算计数的方式:

SELECT COUNT(*) FROM products;
SELECT COUNT(*) FROM products WHERE Brand IN ('Apple');
SELECT COUNT(*) FROM products WHERE Brand IN ('Apple', 'Samsung');
SELECT COUNT(*) FROM products WHERE Brand IN ('Apple') AND Model IN ('A71');

等等

【问题讨论】:

  • 您的描述仍然模棱两可。请创建一个有代表性的数据样本和完整的预期结果,并具体描述如何计算计数。
  • 听起来像XY Problem
  • 感谢您的评论。我编辑了这个问题,希望它能更清楚地说明我想要实现的目标。

标签: mysql database count


【解决方案1】:

您可以为此使用ROLLUP

SELECT 
model, type, size, COUNT(*)
FROM mytab
GROUP BY 1, 2, 3
WITH ROLLUP

利用您的样本数据,我们得到以下信息:

| model | type | size | COUNT(*) |
| ----- | ---- | ---- | -------- |
| A21   | A    | 25   | 1        |
| A21   | A    |      | 1        |
| A21   |      |      | 1        |
| A71   | A    | 30   | 1        |
| A71   | A    | 40   | 1        |
| A71   | A    |      | 2        |
| A71   | C    | 40   | 1        |
| A71   | C    |      | 1        |
| A71   |      |      | 3        |
| B7C   | B    | 20   | 1        |
| B7C   | B    |      | 1        |
| B7C   |      |      | 1        |
| Q32   | B    | 40   | 1        |
| Q32   | B    |      | 1        |
| Q32   |      |      | 1        |
| ZX5   | A    | 30   | 1        |
| ZX5   | A    |      | 1        |
| ZX5   |      |      | 1        |
|       |      |      | 7        |

小计出现在不同列中具有空值的行中,总计是所有分组列都为空的最后一行。

【讨论】:

  • 这很有用,但是我忘了提(我已经编辑了我的问题)我只需要 1 列来指定参数(使用某种唯一的字符串),以便我可以索引它.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
  • 2017-04-30
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多