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'
我不关心两者中的哪一个,只要每次运行查询时都是相同的结果。
答案 0 :(得分: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
如果在info中重复最大长度,则返回重复项。要消除重复,您可以在外面进行分组:
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