【问题标题】:mysql "paste" two results together (side by side)mysql将两个结果“粘贴”在一起(并排)
【发布时间】:2017-03-21 20:05:08
【问题描述】:

我想要类似paste unix 中的命令,它需要两个文件并打印第一个文件的第一行,然后是分隔符,然后是第二个文件的第一行,然后是换行符,然后是第一个文件的第二行分隔符的第二行第二个文件等。

所以我想在 sql 中使用类似的东西,从两个表中获取列,输出结果,从第一个和第二个表中获取第一行的列(作为一行),然后从两个表中获取第二行等。没有像第一个这样的交叉连接的东西第一个表的行与第二个表的第二行等。这甚至可能吗?在网上很难找到这个...

编辑:

Table 1:          Table 2:
column bla        column cla
a                 80
z                 7
f                 15
k

Expected result:
column bla, column cla
a, 80
z, 7
f, 15
k, NULL

非常简单:),除了一点也不...

编辑2: 请不要@variables

【问题讨论】:

  • 您希望结果集中有单列吗?
  • 添加示例表数据,以及预期的结果。
  • 可以使用 concat 和行号变量。为什么要这样做?
  • 已编辑。供以后在一些非常花哨的东西中使用。主要是为了让某些行出现在父select中的固定位置。
  • 如果你也将k添加到表1中,预期的结果是什么?

标签: mysql sql


【解决方案1】:
create table if not exists first_40482804 (
    bla varchar(50)
) ;

create table if not exists second_40482804 (
    cla int
) ;

truncate table first_40482804 ;
truncate table second_40482804 ;

insert into first_40482804 ( bla ) values ('a') ;
insert into first_40482804 ( bla ) values ('z') ;
insert into first_40482804 ( bla ) values ('f') ;

insert into second_40482804 ( cla ) values ( 80 ) ;
insert into second_40482804 ( cla ) values ( 7 ) ;
insert into second_40482804 ( cla ) values ( 15 ) ;

set @blaRow = 0 ;
set @claRow = 0 ;

select concat( `first`.bla,',',`second`.cla) paste from
(   
    select @blaRow:=@blaRow+1 `row` , bla from first_40482804
) `first`
left join 
(
    select @claRow:=@claRow+1 `row` , cla from second_40482804
) `second`
on `first`.`row` = `second`.`row`

--结果

paste
a,80
z,7
f,15

【讨论】:

  • 现在不使用 vars 就可以了,我被卖了! :)
  • 在 mysql 中获取行号需要 vars。 ...您可以将其包装在存储过程中。
  • 我来写一个存储过程的例子。
  • 我为你的努力投了赞成票(谢谢),但变量或过程对我来说不是一种选择,至少不是我想要的。
  • 您需要一些确定行号的方法......它可以是一个变量,也可以是在相关表中添加一列。据我所知,在 mysql 中无法解决。
【解决方案2】:
create table if not exists first_40482804 (
    bla varchar(50)
) ;

create table if not exists second_40482804 (
    cla int
) ;

truncate table first_40482804 ;
truncate table second_40482804 ;

insert into first_40482804 ( bla ) values ('a') ;
insert into first_40482804 ( bla ) values ('z') ;
insert into first_40482804 ( bla ) values ('f') ;

insert into second_40482804 ( cla ) values ( 80 ) ;
insert into second_40482804 ( cla ) values ( 7 ) ;
insert into second_40482804 ( cla ) values ( 15 ) ;

DELIMITER ;;

DROP PROCEDURE IF EXISTS get_paste_stored_procedure ;;

CREATE DEFINER=`root`@`localhost` PROCEDURE get_paste_stored_procedure()
BEGIN

    set @blaRow = 0 ;
    set @claRow = 0 ;

    select concat( `first`.bla,',',`second`.cla) paste from
    (   
        select @blaRow:=@blaRow+1 `row` , bla from first_40482804
    ) `first`
    left join 
    (
        select @claRow:=@claRow+1 `row` , cla from second_40482804
    ) `second`
    on `first`.`row` = `second`.`row` ;

END;;
DELIMITER ;

call get_paste_stored_procedure() ;

【讨论】:

    【解决方案3】:

    MYSQL 中没有 ROWNUMBER 工具,但您可以像这样模仿它:

    SELECT t.*, 
           @rownum := @rownum + 1 AS rank
      FROM YOUR_TABLE t, 
           (SELECT @rownum := 0) r
    

    因此您可以进行 2 次查询,返回每个表的行号:

    SELECT bla, @rownum := @rownum + 1 AS rank
      FROM table_1 , (SELECT @rownum := 0) r1
    
    
    SELECT bla, @rownum := @rownum + 1 AS rank
      FROM table_2 , (SELECT @rownum := 0) r2     
    

    并在行号上将它们连接在一起

    SELECT
        CONCAT( T1.bla,',',T2.cla) 
    FROM
        (   SELECT bla, @rownum := @rownum + 1 AS rank
              FROM table_1 , (SELECT @rownum := 0) r1
        ) T1
    INNER JOIN
        (       SELECT cla, @rownum := @rownum + 1 AS rank
          FROM table_2 , (SELECT @rownum := 0) r2     
        ) T2
        ON T1.rank = T2.rank
    

    当然,使用INNER join 来获得您期望的结果,我猜您在两个表中的行数相同,否则这对我来说毫无意义。


    编辑:我有点晚了,因为基思发布了或多或少相同的方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 2013-12-05
      相关资源
      最近更新 更多