MySQL GroupWise Max по длине поля
-
11-12-2019 - |
Вопрос
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
.
Если вы пытаетесь выбрать тот же идентификатор каждый раз, вы можете использовать ту же идею:
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
.