1

Productテーブル:

id: int
name: varchar(255)
info: varchar(8000)

info名前でグループ化されたすべての製品のリストを取得する必要があります。同じ名前の製品がある場合は、フィールドのデータが最も多い製品を選択して表示する必要があります。もう1つの要件は一貫性です。同じ製品が毎回表示されることが保証されている必要があります。しかし、これに関しては、パフォーマンスはまったく問題ではありません。

だから私がこれまでに思いついた最高のものはこれです:

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'

クエリを実行するたびに同じ結果になる限り、2つのうちどちらを使用してもかまいません。

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

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