【问题标题】:MySQL groupwise max by the length of a fieldMySQL groupwise max 按字段的长度
【发布时间】:2012-07-23 23:24:14
【问题描述】:

Product表:

id: int
name: varchar(255)
info: varchar(8000)

我需要获取所有产品的列表,按名称分组,如果某些产品具有相同的名称,则应选择 info 字段中数据最多的产品来显示。另一个要求是一致性——应该保证每次都展示相同的产品。但性能完全不是我关心的问题。

所以到目前为止我想出的最好的是:

select * from (select * from product order by length(info) desc) as product group by name

我理解这应该在 MySQL 中工作,但不保证结果。

有没有更好的办法?

更新:

我正在寻找的一个例子。如果数据是

1, 'Product1', '12345'
2, 'Product1', '123'
3, 'Product2', '123456'
4, 'Product2', '123456'
5, 'Product2', '12'

预期结果应该是:

1, 'Product1', '12345'
3, 'Product2', '123456'

1, 'Product1', '12345'
4, 'Product2', '123456'

我不在乎两者中的哪一个,只要每次运行查询时结果相同即可。

【问题讨论】:

  • 一致性是什么意思?您不想在产品表中包含所有内容吗?
  • 每次运行查询时获得相同结果的一致性。在我的示例中,MySQL 不保证使用 group by 选择哪个产品,这意味着每次执行查询时结果都可能发生变化。
  • 您说的是哪个“产品”,但查询返回的是所有产品。问题是哪个“信息”。一旦你得到最长的,你需要什么一致性?
  • 我的意思是基本上返回相同的ID。查询不会返回所有产品 - 如果两个产品具有相同的名称,则只有其中一个会出现在结果中。我会用预期的输出更新问题

标签: mysql sql groupwise-maximum


【解决方案1】:

我认为你需要加入:

select p.*
from product p join
     (select p.name, max(len(info)) as maxinfolen
      from product p
      group by p.name
     ) t
     on p.name = t.name and
        len(p.info) = t.maxinfolen

如果最大长度在信息中重复,这将返回重复项。要消除重复,您可以在外面进行分组:

select p.name, max(info)
from product p join
     (select p.name, max(len(info)) as maxinfolen
      from product p
      group by p.name
     ) t
     on p.name = t.name and
        len(p.info) = t.maxinfolen
group by p.name

如果你每次都想选择相同的id,可以使用同样的思路:

select p.*
from product p join
     (select p.name, min(id) as minid
      from product p join
           (select p.name, max(len(info)) as maxinfolen
            from product p
            group by p.name
           ) t
           on p.name = t.name and
              len(p.info) = t.maxinfolen
      group by p.name
     ) t
     on p.name = t.name and
        p.id = t.minid

【讨论】:

  • 在这种情况下仍然需要保证一致性:在group by中应该始终选择相同的产品。因此,如果添加了相同长度的新产品,则会退回已经挑选的第一个产品,而不是这个新产品。
  • 如果没有另一个表的帮助或注册先前选择的方法,我看不到这样做的方法。否则上面的查询回答了要求。
  • 这并不能真正保证一致性。如果两个产品具有相同的名称和相同的 len(info),MySQL 不保证会选择哪一个
  • @Leo,第二版查询返回最大长度的info最大值。这是一致的,除非插入新值。
  • 嗯,我不确定这是否能保证一致的结果。我已经用一个例子更新了我的问题,你确定每次都会选择相同的“Product2”吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 2017-12-05
相关资源
最近更新 更多