按多列分组以获取月份的常用条目

时间:2014-02-19 10:29:25

标签: php mysql sql query-optimization

请参阅以下MySQL表。

-

-
-- Table structure for table `sample_table`
--

CREATE TABLE IF NOT EXISTS `sample_table` (
  `id` bigint(11) NOT NULL AUTO_INCREMENT,
  `station` varchar(300) NOT NULL,
`city` varchar(300) NOT NULL,
  `reviewcount` int(6) NOT NULL,
  `result_month` varchar(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;

INSERT INTO `sample_table`(`id`, `station`, `reviewcount`, `result_month`) VALUES
(1, 'A','NewYork', 10, 'Jan'),
(2, 'B','NewYork', 12, 'Jan'),
(3, 'C','Florida', 14, 'Jan'),
(4, 'A','NewYork', 12, 'Feb'),
(5, 'B','NewYork', 14, 'Feb'),
(6, 'C','Florida', 20, 'Feb'),
(7, 'D','Washington', 12, 'Feb'),
(8, 'A','NewYork', 14, 'Mar'),
 (9, 'B','NewYork', 14, 'Mar'),
(10, 'C','Florida', 28, 'Mar');

在这里,我需要在一系列时间段内获得相同的电台信息。

即,如果我们选择范围从1月到3月,应显示每月结果行的工作站。

此处,只有A和C站在所选范围内的每个月都有审查计数,即从1月到3月。

因此我需要得到像

这样的结果
A - Jan - 10
C - Jan - 14

A - Feb - 12
C - Feb - 20

A - Mar - 14
C - Mar - 28

我尝试了GROUP BY station,result_month并尝试了表的JOIN,但它没有帮助。

我正在使用一个包含数千个工作站的大桌子,我也需要优化查询。

第二部分

我也需要获得城市明智的综合信息, 输出应该是什么样的,

City -Station Count - Review Count

NewYork - 2 - 22 -Jan
Florida - 1 - 14 - Jan

NewYork - 2 - 26 -Jan
Florida - 1 - 10 - Jan

NewYork - 2 - 28 -Jan
Florida - 1 - 28 - Jan

任何帮助都将受到高度赞赏。提前谢谢。

2 个答案:

答案 0 :(得分:1)

第一阶段是让每个月都有一个条目的电台:

SELECT  station
FROM    sample_table
GROUP BY station
HAVING COUNT(DISTINCT result_month) = 
            (SELECT COUNT(DISTINCT result_month) FROM sample_table);

这将为您提供A和C(Example on SQL Fiddle)。

然后您可以将其加入主表:

SELECT  t.station, t.reviewcount, t.result_month
FROM    sample_table t
        INNER JOIN
        (   SELECT  station
            FROM    sample_table
            GROUP BY station
            HAVING COUNT(DISTINCT result_month) = 
                        (SELECT COUNT(DISTINCT result_month) FROM sample_table)
        ) t2
            ON t2.station = t.station;

<强> Example on SQL Fiddle


修改

您的第二个要求有点不清楚,我不确定您希望将城市组合在一起,即如果您的数据如下:

(1, 'A','NewYork', 10, 'Jan'),
(2, 'B','NewYork', 10, 'Jan'),
(3, 'C','NewYork', 10, 'Jan'),
(4, 'A','NewYork', 10, 'Feb'),
(5, 'B','NewYork', 10, 'Feb'),
(6, 'A','NewYork', 10, 'Mar'),
(7, 'B','NewYork', 10, 'Mar');

总和是否应包括C站,因为纽约每个月都有一个条目?因此,1月份总共有30个。在这种情况下,您的查询将是:

SELECT  t.City, SUM(t.reviewcount) AS reviewcount, t.result_month
FROM    sample_table t
        INNER JOIN
        (   SELECT  City
            FROM    sample_table
            GROUP BY City
            HAVING COUNT(DISTINCT result_month) = 
                        (SELECT COUNT(DISTINCT result_month) FROM sample_table)
        ) t2
            ON t2.City = t.City
GROUP BY t.City, t.result_month;

<强> Example on SQL Fiddle

或者它应该只包括A和B,因为这些电台每个月都有一个条目?所以Jan只有20个。你的查询将是

SELECT  t.City, SUM(t.reviewcount) AS reviewcount, t.result_month
FROM    sample_table t
        INNER JOIN
        (   SELECT  station
            FROM    sample_table
            GROUP BY station
            HAVING COUNT(DISTINCT result_month) = 
                        (SELECT COUNT(DISTINCT result_month) FROM sample_table)
        ) t2
            ON t2.station = t.station
GROUP BY t.City, t.result_month;

<强> Example on SQL Fiddle

答案 1 :(得分:0)

GROUP BY子句用于根据某些分组标准汇总数据。对于第一个示例,我将基于名为AdventureWork2012的{​​{1}}数据库表中的单个列对数据进行分组。此示例和我的大多数示例都使用Sales.SalesOrderDetail数据库。如果你想跟随。 http://academy.comingweek.com/sql-groupby-clause/