将多行数据组合到特定列的单行中

时间:2012-11-30 05:07:25

标签: mysql

我有一张桌子 `

name    id   date        login  logout
arjun   1    2012-11-28  9-30   7-30
arjun   1    2012-11-29  9-30   8-00
arjun   1    2012-11-30  9-40   8-00`

我希望将此表视为

`
name    id   date        login  logout
             2012-11-28  9-30   7-30
arjun   1    2012-11-29  9-30   8-00
             2012-11-30  9-40   8-00`

这可能吗?如果是这样的话?

2 个答案:

答案 0 :(得分:0)

你可以用mysql的group_concat

来做
Select 
    name , 
    id , 
    group_concat(date) as `Date`, 
    group_concat(login) as login_time, 
    group_concat(logout) as logout_time
from mytable
group by name

在前端,您可以根据需要使用循环显示。如果你使用的是php,你可以使用php的爆炸功能。如果还有别的东西,那么试着找出如何爆炸细胞的价值。

答案 1 :(得分:0)

假设您的表名为'table55'

然后使用以下查询创建存储过程

delimiter |
create procedure testProcedure()
BEGIN
declare flag1 int default 0;
DECLARE done INT DEFAULT FALSE;
declare tempid int;
declare tempdate date;
declare tempname,templogin,templogout varchar(50);
DECLARE cur1 CURSOR FOR SELECT * from table55 where `name` like 'arjun' and id=1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
drop table if exists mytemptable;
CREATE TEMPORARY TABLE IF NOT EXISTS mytemptable ( `name` VARCHAR(50) NULL DEFAULT NULL,
    `id` INT(11) NULL DEFAULT NULL,
    `date` DATE NULL DEFAULT NULL,
    `login` VARCHAR(50) NULL DEFAULT NULL,
    `logout` VARCHAR(50) NULL DEFAULT NULL);

OPEN cur1;

read_loop: LOOP
FETCH cur1 into tempname,tempid,tempdate,templogin,templogout;
if flag1=0 then
    insert into mytemptable(name,id,`date`,login,logout)  values (tempname,tempid,tempdate,templogin,templogout);
    set flag1=1;
else
    insert into mytemptable(name,id,`date`,login,logout) values ('',null,tempdate,templogin,templogout);
end if;  
IF done THEN
      LEAVE read_loop;
    END IF;

END LOOP;
select * from mytemptable;
END
|
delimiter;

您只需运行一次以上查询。之后,您可以使用以下查询来获取所需的结果

call testProcedure