MySQL group by仅用于查询中的1列

MySQL group by仅用于查询中的1列,mysql,greatest-n-per-group,Mysql,Greatest N Per Group,我有一个类似这样的查询。问题是整个查询被分组,这是不需要的 select `col_1`, `col_2`, `col_3` from `mytable` where ( `col_4` LIKE '%abc%' or `col_5` LIKE '%def%' or `col_6` LIKE '%2020%' ) GROUP BY col_1 # << this groups entire query 这是一个输出示例。第6列有3行2020,其中2行在第1

我有一个类似这样的查询。问题是整个查询被分组,这是不需要的

select `col_1`, `col_2`, `col_3`
from `mytable` 
where (
     `col_4` LIKE '%abc%' 
  or `col_5` LIKE '%def%'  
  or `col_6` LIKE '%2020%'
)
GROUP BY col_1 # << this groups entire query
这是一个输出示例。第6列有3行2020,其中2行在第1列中具有相同的“aaaa”值,因此需要对这2行进行分组。分组项的col_3值将只是列表中的最后一项

+-------+-------+-------+-------+
| col_1 | col_2 | col_3 | col_6 |
+-------+-------+-------+-------+
| aaaa  | abc01 | red   | 2020  |
| aaaa  | abc01 | blu   | 2020  |
| aaaa  | abc01 | blu   | 2019  |
| aabb  | abc01 | grey  | 2020  |
| bbbb  | abc01 | purp  | 2019  |
| cccc  | abc01 | white | 2018  |
+-------+-------+-------+-------+
此查询将具有分页功能,并打算在Laravel中使用。因此,
联合将不起作用,因为这会干扰Laravels分页

这将是理想的结果

+-------+-------+-------+-------+
| col_1 | col_2 | col_3 | col_6 |
+-------+-------+-------+-------+
| aaaa  | abc01 | blu   | 2020  |
| aaaa  | abc01 | blu   | 2019  |
| aabb  | abc01 | grey  | 2020  |
| bbbb  | abc01 | purp  | 2019  |
| cccc  | abc01 | white | 2018  |
+-------+-------+-------+-------+
这组条件,但我需要在此之上的所有其他项目

select `col_1`, `col_2`, `col_3`
from `mytable` 
where (
     `col_4` LIKE '%abc%' 
  or `col_5` LIKE '%def%'  
  or `col_6` LIKE '%2020%'
)
GROUP BY col_1
HAVING `col_6` LIKE '%2020%'

如果
列3
的值不显著,则
按列1、列2、列6分组:

select col_1, col_2, any_value(col_3), col_6
from mytable
where (
  <your conditions here>
)
group by col_1, col_2, col_6
选择列1、列2、任意列值(列3)、列6
从mytable
在哪里(
)
按列1、列2、列6分组

听起来您想同时按列6和列1进行分组,这很好

select `col_1`, `col_2`, `col_3`, `col_6`
from `mytable` 
where (
     `col_4` LIKE '%abc%' 
  or `col_5` LIKE '%def%'  
  or `col_6` LIKE '%zzz%'
)
GROUP BY col_1, col_6
这样,结果将在两个分组列中为每对不同的值对应一行

除此之外,在本例中,对于非分组列
col_2
col_3
的结果,这种类型的查询变得有点含糊不清。应从组中的哪一行使用该值

一种方法是将其他列放入聚合函数中:

select `col_1`, MAX(`col_2`), MAX(`col_3`), `col_6`
from `mytable` 
where (
     `col_4` LIKE '%abc%' 
  or `col_5` LIKE '%def%'  
  or `col_6` LIKE '%zzz%'
)
GROUP BY col_1, col_6
但这是按值计算的,不是按行位置计算的。它甚至可以从组中的不同行获取值,这可能不是您想要的

如果您希望结果行实际上是组中的一行,因此其他列必须来自同一行,那么您必须有某种解决方法。因此,您可以了解各种问题的解决方案,这些问题在堆栈溢出中很常见


这是我过去回答的一个问题,它得到了很多赞成票:

通常,当您执行某种聚合时,您应该使用GROUP BY,但您不这样做。发布示例数据和预期结果,以澄清您想要的内容。帮助我们帮助您-共享一些示例数据和您尝试获得的ITI结果如果这两行组合在一起,col_3列中的值是多少?@forpas我更新了我的问题。对于分组项目,该值将不重要,因为该列不会显示在前端。很好,但FWIW MySQL不支持ANY_value()聚合函数。Cf.@BillKarwin那么这是什么:我以前没有见过这个函数,聚合函数也不在页面上。你说得对。获取
错误代码:1305。函数any_value不存在
@weber函数any_value()是在Mysql 5.7中引入的,现在是8.0版。您的版本是什么?谢谢,但我需要将col_1按此特定条件分组
col_6,如“%zzz%”
,其他所有人都需要完整的结果,但实际上不清楚您要做什么。我认为您应该展示更多的数据示例,以及您希望从这些数据中得到的结果。
select `col_1`, MAX(`col_2`), MAX(`col_3`), `col_6`
from `mytable` 
where (
     `col_4` LIKE '%abc%' 
  or `col_5` LIKE '%def%'  
  or `col_6` LIKE '%zzz%'
)
GROUP BY col_1, col_6