2012-07-25 69 views
1

Product表:MySQL的GroupWise的最大的一個字段的長度

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

你說的一致意思?你不想在產品表中包含所有內容嗎? – 2012-07-25 14:41:50

+0

每次運行查詢時獲得相同結果的一致性。以我的例子MySQL不能保證哪個產品將被分組選取,這意味着每次執行查詢時結果都可能發生變化。 – Leo 2012-07-25 15:08:05

+0

你說哪個「產品」,但查詢是返回所有產品。問題是哪個「信息」。一旦你獲得了最長的一次,你需要什麼樣的一致性? – 2012-07-25 15:36:36

回答

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 

這將返回副本,如果信息被重複的最大長度。要通過在外面消除重複,可以羣:

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 
+0

仍然需要保證在這種情況下的一致性:總是應該在組中選擇相同的產品。所以如果添加一個具有相同長度的新產品,則已經選擇的第一個產品將被退回,而不是這個新產品。 – 2012-07-25 14:12:22

+0

,我沒有辦法做到這一點,沒有另一個表的幫助或意味着註冊以前的選擇。否則上面的查詢將回答要求。 – 2012-07-25 14:21:27

+0

這並不能保證一致性。如果兩個產品具有相同的名稱和相同的len(info),MySQL不保證將選擇哪一個 – Leo 2012-07-25 15:11:04