2011-05-04 56 views
2

我有一个包含3个字段的品牌,型号和BenchMark分数的MySQL表。获取不同值的总计数

有关数据如何在此表中的注意事项。

1.品牌可以有不同的型号。 2.不同的品牌可以有同样的型号 3.特定品牌型号组合可以有不同的Benchmark分数。

所以表中的数据将是这个样子

Brand ModelName Benchmark 

B1 M1   1000 
B1 M1   2000 
B1 M2   3000 
B1 M2   2000 
B2 M1   3000 
B2 M3   4000 

现在我需要的是找到的时间数量的特定基准分数报告。

在这里,我们应该只计算那些模型 - 品牌组合的最大基准分数,而不是所有这些基准分数。

结果应该是这样的

Score Times 
3000 2 
2000 1 
4000 1 

那么应该是MySQL的声明,如果我需要这个result..please帮助

回答

2
SELECT * FROM 
(SELECT MX,COUNT(1) SC FROM 
(SELECT MAX(MaxScores.MaxScore) MX,ScoreCounts.ScoreCount FROM 
(
    SELECT MAX(BenchMark) MaxScore,Brand,ModelName 
    FROM benchmarks GROUP BY Brand,ModelName 
) MaxScores 
INNER JOIN 
(
    SELECT COUNT(1) ScoreCount,Brand,ModelName 
    FROM benchmarks GROUP BY Brand,ModelName 
) ScoreCounts 
USING (Brand,ModelName) 
GROUP BY Brand,ModelName 
) A GROUP BY MX) AA ORDER BY SC DESC,MX; 

此查询完全产生你在找什么,并将结果显示在你的问题有它的确切顺序。我用这个问题的样本数据进行了试验。这里是我得到的:

mysql> use test 
Database changed 
mysql> drop table if exists benchmarks; 
Query OK, 0 rows affected (0.05 sec) 

mysql> CREATE TABLE benchmarks (Brand CHAR(2),ModelName CHAR(2),BenchMark INT,key (Brand,ModelName)); 
Query OK, 0 rows affected (0.14 sec) 

mysql> INSERT INTO benchmarks VALUES 
    -> ('B1','M1',1000), 
    -> ('B1','M1',2000), 
    -> ('B1','M2',3000), 
    -> ('B1','M2',2000), 
    -> ('B2','M1',3000), 
    -> ('B2','M3',4000); 
Query OK, 6 rows affected (0.03 sec) 
Records: 6 Duplicates: 0 Warnings: 0 

mysql> SHOW CREATE TABLE benchmarks\G 
*************************** 1. row *************************** 
     Table: benchmarks 
Create Table: CREATE TABLE `benchmarks` (
    `Brand` char(2) DEFAULT NULL, 
    `ModelName` char(2) DEFAULT NULL, 
    `BenchMark` int(11) DEFAULT NULL, 
    KEY `Brand` (`Brand`,`ModelName`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 
1 row in set (0.00 sec) 

mysql> SELECT * FROM benchmarks; 
+-------+-----------+-----------+ 
| Brand | ModelName | BenchMark | 
+-------+-----------+-----------+ 
| B1 | M1  |  1000 | 
| B1 | M1  |  2000 | 
| B1 | M2  |  3000 | 
| B1 | M2  |  2000 | 
| B2 | M1  |  3000 | 
| B2 | M3  |  4000 | 
+-------+-----------+-----------+ 
6 rows in set (0.01 sec) 

mysql> SELECT * FROM 
    -> (SELECT MX,COUNT(1) SC FROM 
    -> (SELECT MAX(MaxScores.MaxScore) MX,ScoreCounts.ScoreCount FROM 
    -> (
    ->  SELECT MAX(BenchMark) MaxScore,Brand,ModelName 
    ->  FROM benchmarks GROUP BY Brand,ModelName 
    ->) MaxScores 
    -> INNER JOIN 
    -> (
    ->  SELECT COUNT(1) ScoreCount,Brand,ModelName 
    ->  FROM benchmarks GROUP BY Brand,ModelName 
    ->) ScoreCounts 
    -> USING (Brand,ModelName) 
    -> GROUP BY Brand,ModelName 
    ->) A GROUP BY MX) AA ORDER BY SC DESC,MX; 
+------+----+ 
| MX | SC | 
+------+----+ 
| 3000 | 2 | 
| 2000 | 1 | 
| 4000 | 1 | 
+------+----+ 
3 rows in set (0.01 sec) 

试试看!

+0

完美..这正是我一直在寻找...感谢您的时间和帮助 – Shijilal 2011-05-04 15:10:02

+0

是的,这是行之有效的! – anothershrubery 2011-05-04 15:10:15

0
SELECT b.model, b.brand, bd.score, COUNT(*) 
FROM (
     SELECT model, brand, MAX(score) AS mscore 
     FROM benchmark 
     GROUP BY 
       model, brand 
     ) bd 
JOIN benchmark b 
ON  b.model = bd.model 
     AND b.brand = bd.brand 
     AND b.score = bd.mscore 
GROUP BY 
     b.model, b.brand 

(model, brand, score)这个工作快速创建索引。

更新:

SELECT score, COUNT(*) AS cnt 
FROM benchmark 
GROUP BY 
     score 
ORDER BY 
     cnt DESC 
+0

谢谢,但我需要的结果是不同的。如果一个品牌型号组合获得了3000和2000分,另一个品牌型组合获得3000和1000分,那么我需要的结果是“3000 - 2倍”..希望得到我的观点 – Shijilal 2011-05-04 14:50:32

+0

@ Shijilal:查看帖子更新。 – Quassnoi 2011-05-04 14:55:58

+0

我的要求是,我们应该只考虑任何品牌模型组合的最高基准分数,并且结果应该会给出每个基准分数的总数.Ronaldo的回答给了我我正在寻找的东西。你的帮助和时间 – Shijilal 2011-05-04 15:17:29