mysql - 使用sql结果指定要连接的表

标签 mysql sql join relational-database

有什么方法可以使用结果来指定要连接的表吗?

我想做类似的事情

SELECT id, some_number, ... FROM sometable NATURAL JOIN someothertable_$some_number;

我知道关系代数中没有这样的东西,所以我可能不会成功,我只是想确定一下。

我不想使用任何 SQL 脚本。

最佳答案

此处可运行示例:http://sqlfiddle.com/#!2/5e92c/36

为此示例设置表的代码:

create table if not exists someTable 
(
  someTableId bigint not null auto_increment
  , tableId int not null
  , someOtherTableId bigint not null

  , primary key (someTableId)
  , index (tableId, someOtherTableId)
);

create table if not exists someOtherTable_$1
(
  someOtherTableId bigint not null auto_increment
  , data varchar(128) character set utf8

  , primary key (someOtherTableId)
);

create table if not exists someOtherTable_$2
(
  someOtherTableId bigint not null auto_increment
  , data varchar(128) character set utf8

  , primary key (someOtherTableId)
);

insert sometable (tableId, someOtherTableId) values (1, 1);
insert sometable (tableId, someOtherTableId) values (1, 2);
insert sometable (tableId, someOtherTableId) values (2, 2);
insert sometable (tableId, someOtherTableId) values (2, 3);

insert someothertable_$1(data) values ('table 1 row 1');
insert someothertable_$1(data) values ('table 1 row 2');
insert someothertable_$1(data) values ('table 1 row 3');

insert someothertable_$2(data) values ('table 1 row 1');
insert someothertable_$2(data) values ('table 1 row 2');
insert someothertable_$2(data) values ('table 1 row 3');

静态解决方案

如果您的表是固定的,这里有一个解决方案(例如,在示例中您只有 someOtherTable 1 和 2/您不需要在添加新表时自动更改代码):

select st.someTableId
, coalesce(sot1.data, sot2.data)
from someTable st
left outer join someOtherTable_$1 sot1
on st.tableId = 1
and st.someOtherTableId = sot1.someOtherTableId
left outer join someOtherTable_$2 sot2
on st.tableId = 2
and st.someOtherTableId = sot2.someOtherTableId;

动态解决方案

如果表的数量可能在运行时发生变化,则需要编写动态 SQL。请注意:对于每一个连续的表,您都会受到性能影响。我不建议将其用于生产系统;但这是一个有趣的挑战。如果您可以描述您的工具集以及您希望实现的目标,我们也许可以为您提供一些更合适的前进方向的指导。

select group_concat(distinct ' sot' , cast(tableId as char) , '.data ') 
into @coalesceCols 
from someTable;

select group_concat(distinct ' left outer join someOtherTable_$', cast(tableId as char), ' sot', cast(tableId as char), ' on st.tableId = ', cast(tableId as char), ' and st.someOtherTableId = sot', cast(tableId as char), '.someOtherTableId ' separator '') 
into @tableJoins 
from someTable;

set @sql = concat('select someTableId, coalesce(', @coalesceCols ,') from someTable st', @tableJoins);

prepare stmt from @sql;
execute stmt;

关于mysql - 使用sql结果指定要连接的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13521355/

相关文章:

java - 如何验证 JDBC 登录名/密码的正确性

php - MySQL查询错误

mysql - SQL Join表获取平均值

php - PhpMyAdmin 中的请求与 Laravel 查询生成器一起工作,似乎不起作用

c++ - 线程基本..需要帮助

r - 使用大于和小于列名中的符号连接 data.tables 时出现问题

mysql - 我应该为这些用户使用哪些 mysql 权限?

php - 合并 MySQL 查询

php - 如何改进和加速这个使用嵌套循环的 PHP 脚本?

mysql - 选择数据库的最新/最新添加