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'
.

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

有帮助吗?

解决方案

我认为你需要做一个加入:

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
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top