Вопрос

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
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top