如何通过MYSQL中的另一列选择具有Max值的行,DISTINCT

时间:2018-01-17 17:00:38

标签: mysql

我有这个示例表:

id        city       show    
-------  -------    ------ 
 1        Paris     Show1
 2        NY        Show1
 3        Paris     Show2
 4        Madrid    Show3
 5        Madrid    Show3
 6        NY        Show2
 7        NY        Show1
 8        Paris     Show2

Plz can任何人都可以通过MySQL查询帮助我获得城市中最受欢迎的节目。结果应该是这样的:

city      Show      Occurence
 NY       Show1        2
Paris     Show2        2
Madrid    Show3        2

我将非常感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

E.g:

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,city VARCHAR(12) NOT NULL
,performance VARCHAR(12) NOT NULL
);

INSERT INTO my_table VALUES
(1,'Paris'     ,'Show1'),
(2,'NY'        ,'Show1'),
(3,'Paris'     ,'Show2'),
(4,'Madrid'    ,'Show3'),
(5,'Madrid'    ,'Show3'),
(6,'NY'        ,'Show2'),
(7,'NY'        ,'Show1'),
(8,'Paris'     ,'Show2');   


 SELECT x.*
      , z.total
   FROM my_table x
   JOIN
      ( SELECT city, MAX(id) max_id FROM my_table GROUP BY city ) y
     ON y.city = x.city
    AND y.max_id = id
   JOIN (SELECT city, performance, COUNT(*) total FROM my_table GROUP BY city,performance) z
     ON z.city = x.city 
    AND z.performance = x.performance;

+----+--------+-------------+-------+
| id | city   | performance | total |
+----+--------+-------------+-------+
|  5 | Madrid | Show3       |     2 |
|  7 | NY     | Show1       |     2 |
|  8 | Paris  | Show2       |     2 |
+----+--------+-------------+-------+

答案 1 :(得分:1)

在mysql中有一种超级简单的方法:

SELECT * FROM (
    SELECT 
       city, 
       `show`, 
       count(id)  
    FROM 
       showTable 
    GROUP BY 
       city,`show` 
    ORDER BY 
       count(id) 
    DESC
) as temp 
GROUP BY 
  city

这是有效的,因为在mysql中你不允许聚合非分组列,在这种情况下,mysql只返回第一行。解决方案是首先对数据进行排序,使得对于每个组,您想要的行是第一个,然后按您想要值的列进行分组(在这种情况下为city)。

注意,对INNER查询进行排序非常重要。否则订单未确定,因此使用没有聚合的GROUP BY(在外部查询上)将不时返回另一行。 (你也将面对这个,如果两个节目在同一个城市有相同的数量 - 有时它将返回“showX”,有时“showY”)

http://sqlfiddle.com/#!9/0b887/7

(在测试查询之后,我在这里找到了一个写得很好的声明,基本上是同一个问题 - 所以不需要自己编写:Get records with max value for each group of grouped SQL results

ps。:如果你检查这个小提琴:http://sqlfiddle.com/#!9/7a9be9/1 - TESTTOWN会不时地在show1和show2之间交替。