2

我有一个group_concat从一列返回所有字符串。字符串可以是可变长度的。如何选择返回的第一个字符串group_concat(其中“第一个”由group_concat 排序子句定义)?


这是一个简化的例子。从蔬菜表中选择每种蔬菜类型中最便宜的蔬菜。

从此表:

蔬菜类价格
----------------------
胡萝卜根 1.23
萝卜根 0.45
豆芽芽 3.56
...

选择这个:

精选蔬菜价格
------------------
萝卜 0.45
豆芽 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”将返回“萝卜,胡萝卜”。然后定位找到第一个逗号。然后 substring 返回该逗号之前的所有字符。所以“selectedVeg”等于“萝卜”。

我添加了一个CONCAT以确保始终有一个逗号可供LOCATE查找。

这似乎不是很有效,因为GROUP_CONCAT必须运行两次(这在我的实际问题中非常复杂)。

谢谢。

4

1 回答 1

0

使用预查询来获得每个“类型”的最低价格,然后加入那个......

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

并在查询末尾添加 GROUP BY v2.Type.... 您的选择。

于 2011-05-20T14:08:20.120 回答