选择不在GROUP BY子句中的列

时间:2019-06-30 04:50:29

标签: mysql database

我正在尝试编写一个查询,该查询将仅选择具有事件的行,而该行是当年唯一的事件。

例如:

Year   Event
2011     A
2011     B
2012     C
2013     B
2013     D
2014     D

因此,我想在结果中获取行2012 C2014 D。 我尝试在GROUP BY上进行Year,但这不能让我选择Event列。 2011年和2013年有2个事件,所以这些不应该出现在结果中。

请帮助。

编辑:我可以编写一个嵌套查询,以仅获取具有count(Year) = 1GROUP BY Year的行,但是无法获取外部查询中选择的Event列< / p>

SELECT Year, Event from table where Year in (SELECT Year from table GROUP BY Year Having count(*) = 1) as count;

5 个答案:

答案 0 :(得分:5)

不需要使用子查询或嵌套查询。您可以简单地按Year字段分组,并使用HAVING COUNT(Year)=1查找所需的行。因此,适用的查询将是:

SELECT Year, Event
FROM table_name
GROUP BY Year
HAVING COUNT(Year)=1

您可以在以下位置找到可执行解决方案示例:

http://sqlfiddle.com/#!9/b47044/11

逻辑: 当您按Year分组时,它将汇总同一年的所有行。因此,2的计数将为2011

您可以通过运行以下命令进行检查:

SELECT Year, Event, COUNT(Year) as event_count
FROM table_name
GROUP BY Year

您可以在以下位置看到执行的中间步骤:http://sqlfiddle.com/#!9/b47044/10

上述解决方案仅适用于<5.7版的MySQL。对于更高版本,请在下面找到解决方案。

对于5.7及更高版本,默认情况下启用ONLY_FULL_GROUP_BY SQL模式,因此这将失败。您可以更新此模式(请参考SELECT list is not in GROUP BY clause and contains nonaggregated column .... incompatible with sql_mode=only_full_group_by下的答案),也可以使用ANY_VALUE()函数来引用未聚合的列,因此在MySQL 5.7及更高版本中适用的更新查询为:< / p>

SELECT Year, ANY_VALUE(Event)
FROM table_name
GROUP BY Year
HAVING COUNT(Year)=1;

您可以在以下位置找到可执行的示例:https://paiza.io/projects/e/tU-7cUoy3hQUk2A7tFfVJg

参考:https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/miscellaneous-functions.html#function_any-value

答案 1 :(得分:2)

查询中有一个小错误,在have子句中使用的count(*)也应该在select子句中

SELECT Year, Event from table where Year in ( SELECT Year from ( SELECT Year,count(*) from table GROUP BY Year Having count(*) = 1)temp );

答案 2 :(得分:2)

仅需要过滤包含Year的单个事件的Year和事件

  1. 内部查询只会给您包含一个事件的年份
  2. 外部查询将选择当年的事件
SELECT Year, Event from table where Year in 
(SELECT Year from table GROUP BY Year Having count(*) = 1);

答案 3 :(得分:1)

好问题,

您甚至不需要子查询即可获得所需的输出。将所有事件名称连接到一个字符串中,然后在字符串中搜索逗号,。如果找到逗号,,则今年有多个事件,否则只有一个。

   SELECT Year, GROUP_CONCAT(Event) AS Event FROM Events GROUP BY (year) having 
   INSTR(Event, ",") = 0;

答案 4 :(得分:-1)

SELECT Year, Event 
FROM table 
WHERE Year in (SELECT Year 
               FROM table 
               GROUP BY Year 
               HAVING count(*) = 1);