![](/img/trans.png)
[英]How can I SELECT rows with MAX(Column value), PARTITION by another column in MYSQL?
[英]How can I SELECT rows with Max value, DISTINCT by another column in 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有人可以帮助我进行MySQL查询,以使您最多看到城市显示的节目。 结果应该是这样的:
city Show Occurence
NY Show1 2
Paris Show2 2
Madrid Show3 2
我将非常感谢您的帮助。
例如:
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 |
+----+--------+-------------+-------+
在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
(在测试查询之后,我在这里找到了一个写得很好的语句,基本上是相同的问题-因此无需编写自己的语句: 获取每个分组的SQL结果的最大值的记录 )
ps .:如果您检查此提琴: http ://sqlfiddle.com/#!9/7a9be9/1-TESTTOWN将不时在show1和show2之间交替。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.