2011-05-04 53 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