2011-05-20 389 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添加一个组到查询的末尾。 ... 你的选择。