我有这个示例表:
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
我将非常感谢你的帮助。
答案 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之间交替。