mysql获取列名并与另一个表进行比较

mysql获取列名并与另一个表进行比较,mysql,Mysql,我有两张桌子 表A 表b 是否可以从表A中选择编号,也可以从表B中选择实际项目名称? 用英语写的陈述应该是 select * from table A and itemName from table B where TableA's columnName = TableB's ItemName; 如果我没有弄错,你可以: select a.*, ba.item_name item_name_a, bb.item_name item_name_b from a left join b ba on

我有两张桌子

表A

表b

是否可以从表A中选择编号,也可以从表B中选择实际项目名称? 用英语写的陈述应该是

select * from table A and itemName from table B where TableA's columnName = TableB's ItemName;

如果我没有弄错,你可以:

select a.*, ba.item_name item_name_a, bb.item_name item_name_b
from a
left join b ba on ba.item_code = 'A001'
left join b bb on bb.item_code = 'B001'
也可以使用子查询:

select
    a.*,
    (select item_name from b where item_code = 'A001') item_name_a,
    (select item_name from b where item_code = 'B001') item_name_b
from a

我猜您只想使用information\u schema.columns和动态sql替换标题

set @sql = (select concat('select date,',
        aa.gc1,
        ' from (',
        replace(substring(bb.gc2,1,length(bb.gc2) - length('union all')),'union all,','union all '),
        ') s group by date'
        )
from
(
select 
        group_concat(
         'max(case when itemname = ',char(39),itemname,char(39),' then value  end) as ',itemname
         ) gc1
from
(
select itemname , column_name from information_schema.columns 
join   t1 on t1.itemcode = column_name
where table_name = 't'
and column_name in (select distinct itemcode from t1)
) a
) aa
cross join
(
select 
        group_concat(
         'select date,',char(39),itemname,char(39),' as itemname,', column_name,' as value from t  union all'
         ) gc2
from
(
select itemname , column_name from information_schema.columns 
join   t1 on t1.itemcode = column_name
where table_name = 't'
and column_name in (select distinct itemcode from t1)
) b
) bb
) ;

prepare sqlstmt from @sql;
execute sqlstmt;
deallocate prepare sqlstmt;

+------+-------+-------+
| date | candy | Apple |
+------+-------+-------+
| 2020 |     2 |     3 |
+------+-------+-------+
1 row in set (0.001 sec)

如果您的意思是不将列名指定为常量,那么没有动态sql是不可能的。但是为什么你想知道你希望你的输出是什么样子的呢?谢谢你的回复,我忘了提到一些东西了,因为表A中有两列以上的内容,有没有什么方法可以代替硬编码item_code='A001'来获得这类信息@kownowl:在纯SQL中,不需要。您需要动态SQL,这要复杂得多。如果我想获得所有列的名称并将其用作另一个表(如)中的比较,该怎么办。从表a中获取所有列名,其中A001为a,B001为b,。。并使用此结果执行以下操作:从表B中选择名称,其中代码=a;在两个不同的问题中,我感谢你的回答。我有一个愚蠢的问题。是否有任何方法可以在不知道列名称的情况下以C或其他语言输出所有值?比如在你的例子中:我想做console.writeline,它会打印2020,2,3,这对你的c语言没有帮助。如果c对你很重要,你应该在问题中这样说。但是一般来说,有可能把所有的列都变成行吗?例如,如果我在1行中有5列:1、2、3、4、5,我可以选择它,使其显示为1列5行吗?select from子查询b创建一条语句,该语句将取消PIVOT,将@sql设置为该语句并执行。
select
    a.*,
    (select item_name from b where item_code = 'A001') item_name_a,
    (select item_name from b where item_code = 'B001') item_name_b
from a
set @sql = (select concat('select date,',
        aa.gc1,
        ' from (',
        replace(substring(bb.gc2,1,length(bb.gc2) - length('union all')),'union all,','union all '),
        ') s group by date'
        )
from
(
select 
        group_concat(
         'max(case when itemname = ',char(39),itemname,char(39),' then value  end) as ',itemname
         ) gc1
from
(
select itemname , column_name from information_schema.columns 
join   t1 on t1.itemcode = column_name
where table_name = 't'
and column_name in (select distinct itemcode from t1)
) a
) aa
cross join
(
select 
        group_concat(
         'select date,',char(39),itemname,char(39),' as itemname,', column_name,' as value from t  union all'
         ) gc2
from
(
select itemname , column_name from information_schema.columns 
join   t1 on t1.itemcode = column_name
where table_name = 't'
and column_name in (select distinct itemcode from t1)
) b
) bb
) ;

prepare sqlstmt from @sql;
execute sqlstmt;
deallocate prepare sqlstmt;

+------+-------+-------+
| date | candy | Apple |
+------+-------+-------+
| 2020 |     2 |     3 |
+------+-------+-------+
1 row in set (0.001 sec)