2011-05-20 47 views
1

我有一個group_concat,它返回一列中的所有字符串。字符串可以是可變長度的。如何選擇由group_concat返回的第一個字符串(其中「第一個」由group_concat排序子句定義)?mysql - 選擇group_concat返回的第一個項目

這裏是一個簡化的例子。從蔬菜表中選擇每種蔬菜類型中最便宜的蔬菜。

從這個表...

 
veg  type price 
------------------- 
carrot root 1.23 
turnip root 0.45 
sprouts bud 3.56 
... 

選擇此....

 
selectedVeg price 
------------------- 
turnip  0.45 
sprouts  3.56 
... 

我的笨拙嘗試....

 
select 
    substring(
     group_concat(veg order by price), 
     1, 
     locate(',', 
      concat(
       group_concat(veg order by price), 
       ',') 
      ) 
     -1) 
    as selectedVeg 
    from vegTable 
    group by type 

所以根類蔬菜,'group_concat'將返回'蘿蔔,胡蘿蔔'。然後,找到第一個逗號。然後子字符串返回所有字符到這個逗號。 所以selectedVeg等於'蘿蔔'。

我已經添加了一個'concat'來確保總是有一個逗號來查找。

這看起來似乎非常有效,因爲group_concat必須運行兩次(在我的實際問題中它非常複雜)。 謝謝。

+0

如果你只是從蔬菜的「類型」中返回一個SINGLE項目,那麼你是否還有一個原因,你甚至會對羣組concat產生困擾?我不是,它更簡單,但如果你使用的是group_concat,只要不想混淆最終答案,那麼仍然可以完成。另外,如果兩個或更多的蔬菜具有相同的「最低」價格,那該怎麼辦? – DRapp 2011-05-20 13:53:15

+0

謝謝@DRapp如果我可以做到這一點,而不使用group_concat,那麼這將是偉大的。我該怎麼做呢?由於「小組」會自行返回隨機蔬菜。如果兩個蔬菜價格相同,那麼返回哪一個蔬菜並不重要。 – spiderplant0 2011-05-20 13:56:58

回答

0

使用預先查詢來獲取每「TYPE」最小的代價,然後再加入到...

select 
     v2.veg, 
     v2.Price 
    from 
     (select v1.type, min(v1.price) as MinimumPrice 
      from Veggies v1 
      group by v1.type) PreQuery 
     join Veggies v2 
     on PreQuery.Type = v2.type 
     and PreQuery.MinimumPrice = v2.price 

這個查詢將在一個給定類型的最低價格回報所有的蔬菜。如果你想有一個單列,你可以改變

v2.Veg使用GROUP_CONCAT(v2.Veg ...)作爲SelectedVeg

和BY v2.Type添加一個組到查詢的末尾。 ... 你的選擇。

相關問題