我正在尝试编写一个查询,该查询将仅选择具有事件的行,而该行是当年唯一的事件。
例如:
Year Event
2011 A
2011 B
2012 C
2013 B
2013 D
2014 D
因此,我想在结果中获取行2012 C
和2014 D
。
我尝试在GROUP BY
上进行Year
,但这不能让我选择Event
列。
2011年和2013年有2个事件,所以这些不应该出现在结果中。
请帮助。
编辑:我可以编写一个嵌套查询,以仅获取具有count(Year) = 1
和GROUP BY Year
的行,但是无法获取外部查询中选择的Event
列< / p>
SELECT Year, Event from table where Year in (SELECT Year from table GROUP BY Year Having count(*) = 1) as count;
答案 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和事件
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);