2012-09-27 15 views
2

图片,我们有这样的一个表:如何按/ group_concat分组每个结果集?

表1

+----------+----------+--------+------------+ 
| position | epoc  | name | value  | 
+----------+----------+--------+------------+ 
| 1  | 1  | A |  v01 | 
| 1  | 1  | B |  v02 | 
| 1  | 1  | C |  v03 | 
| 1  | 2  | A |  v04 | 
| 1  | 2  | B |  v05 | 
| 1  | 2  | C |  v06 | 
| 1  | 3  | A |  v07 | 
| 1  | 3  | B |  v08 | 
| 1  | 3  | C |  v09 | 
| 1  | 4  | A |  v10 | 
| 1  | 4  | B |  v11 | 
| 1  | 4  | C |  v12 | 
| 2  | 5  | A |  v13 | 
| 2  | 5  | B |  v14 | 
| 2  | 5  | C |  v15 | 
| 2  | 6  | A |  v16 | 
| 2  | 6  | B |  v17 | 
| 2  | 6  | C |  v18 | 
| 2  | 7  | A |  v19 | 
| 2  | 7  | B |  v20 | 
| 2  | 7  | C |  v21 | 
| 2  | 8  | A |  v22 | 
| 2  | 8  | B |  v23 | 
| 2  | 8  | C |  v24 | 
+----------+----------+--------+------------+ 

我希望能够得到这个表:

表2

+----------+--------------------+ 
| position | value    | 
+----------+--------------------+ 
| 1  | v01,v02,v04,v05 | 
| 2  | v13,v14,v16,v17 | 
+----------+--------------------+ 

条件是:

  • 只是带有“name”A或B的行的“值”;
  • JUST“epocs”是前两个唯一结果的“位置”(epoc 3,4,7,8被丢弃)
  • GROUP by table1 position(对于每个位置,我希望匹配值的连接以前的条件)
+0

SELECT GROUP_CONCAT(值),名字FROM(SELECT '@' 行:= '@' 行+1作为rownum,位置,值,名称位置FROM(SELECT'@'row:= 0)r,table1)s WHERE rownum%2 = 1和name =“A”按位置分组; 这会产生一个表格,每个“位置”只有第一个“名称”值,而不是设置“名称”<2的第一个(或多个)。它也不会给我“epocs”的限制,它会返回所有! “epocs” – kairos

回答

4

这可能是你在找什么:

select position, 
    group_concat(value order by overall_row_num) value 
from 
(
    select position, 
     name, 
     value, 
     epoc, 
     @num := if(@position = `position`, @num + 1, 1) as group_row_number, 
     @position := `position` as dummy, 
     overall_row_num 
    from 
    (
    select position, name, 
     epoc, 
     value, 
     @rn:[email protected]+1 overall_row_num 
    from t1, (SELECT @rn:=0) r 
    where name in ('A', 'B') 
    order by position, epoc 
) x 
    order by overall_row_num 
) x1 
where group_row_number <= 4 
group by position 

SQL Fiddle with demo

+1

'按位置排序,在'x'里面的epoc'是强制性的,在其他情况下它可能会失败[fiddle here](http://sqlfiddle.com/#!2/30a44/30) –

+0

@LuisSiquot你是正确的,固定的。感谢您的支持 – Taryn

+0

+1欢迎 –