mysql - 动态连接 MySQL 表

标签 mysql join stored-procedures

我正在编写一个MySQL存储过程,它必须将“基”表与其他表连接起来。 要连接哪个其他表取决于基表中的字段

这是基表:

ID - Value - JoinValue - TableToJoin - FieldToJoin
---------------------------------------------------
 1 - Test  - aa        - tbl_test1   - test1field
 2 - Test2 - bb        - tbl_test2   - test2field

作为输出,我想要:

ID - Value - ValueFromOtherTable
----------------------------------------------
aa  - Test  - ValueFromTBL_TEST1Field
bb  - Test2 - ValueFromTBL_TEST2Field

这有可能吗? 也许有点像这样?

SELECT
 ID,
 Value,
 (SELECT @FieldToJoin FROM @TableToJoin AS t WHERE t.ID = @JoinValue) AS ValueFromOtherTable
FROM tbl_base;

已经尝试过某种 JOIN,但不幸的是我找不到答案。

你好,索拉

最佳答案

这种设计通常是一个坏主意,你不能按照你的想法动态选择要加入的表,但它可以通过一种粗略的、相当暴力的方式来完成......

SELECT stuff 
   , COALESCE(t2.something, t3.something, ....) AS otherTsomething
FROM t1
LEFT JOIN t2 ON t1.TableToJoin = "t2" 
   AND t1.JoinValue = CASE t1.FieldToJoin WHEN "a" THEN t2.a WHEN "b" THEN t2.b .... END
LEFT JOIN t3 ON t1.TableToJoin = "t3" 
   AND t1.JoinValue = CASE t1.FieldToJoin WHEN "a" THEN t3.a WHEN "b" THEN t3.b .... END
;

通常,此类数据的适当设计是让 t2 和 t3 引用 t1,那么它就变成了......

SELECT stuff, COALESCE(t2.something, t3.something, ...) AS otherSomething
FROM t1
LEFT JOIN t2 ON t1.id = t2.t1_id
LEFT JOIN t3 ON t1.id = t3.t1_id
;

(出于您的目的,这在某种程度上假定只有一个 t2 或 t3 与 t1 记录相关联;但这很难执行,并且在一般使用中实际上不会出现问题。)

关于mysql - 动态连接 MySQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59774104/

相关文章:

MySQL 子字符串搜索(前缀 ID)

MySql 查询 - 计算行数和百分比

c# - 如何使用 Linq 连接两个表并计算一列匹配记录的行数

php - 在优化查询方面需要帮助

PostgreSQL:在一个函数中插入、删除和更新的 If Else 语句

mysql - 获取每组前 X 天的收入

mysql - mysql 复制可以配置为防止删除数据库被复制吗?

join - 如何使用 django-tables2 连接两个表

sql - 存储过程执行另一个存储过程

php - 在 foreach 循环中调用存储过程 - 仅首先执行