1

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'

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

4

1 回答 1

0

我认为您需要加入:

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
于 2012-07-25T13:54:51.510 回答