基于列数据和表名的MYSQL连接表

基于列数据和表名的MYSQL连接表,mysql,join,polymorphic-associations,Mysql,Join,Polymorphic Associations,我想知道这是否可能 我想根据表1的数据连接两个表。 示例表1中的food列的数据为“hotdog” 我有一张叫热狗的桌子 是否可以像这样进行连接 SELECT * FROM table1 t join t.food on id = foodid 我知道它不起作用,但它甚至是可能的,周围有工作吗 提前感谢。仅适用于动态SQL。也可以基于类型左键联接许多不同的表和用例,但是这些表都必须事先知道 如果我们更了解您想要实现的目标、您的设计当前的外观以及您首先选择特定表格设计的原因,那么推荐合适的设计就

我想知道这是否可能

我想根据表1的数据连接两个表。 示例表1中的food列的数据为“hotdog”

我有一张叫热狗的桌子

是否可以像这样进行连接

SELECT * FROM table1 t join t.food on id = foodid
我知道它不起作用,但它甚至是可能的,周围有工作吗


提前感谢。

仅适用于动态SQL。也可以基于类型左键联接许多不同的表和用例,但是这些表都必须事先知道

如果我们更了解您想要实现的目标、您的设计当前的外观以及您首先选择特定表格设计的原因,那么推荐合适的设计就更容易了

Say you have a table of foods:

id INT
foodtype VARCHAR(50) (right now it just contains 'hotdog' or 'hamburger')
name VARCHAR(50)

Then hotdogs:

id INT
length INT
width INT

Then hamburgers:

id INT
radius INT
thickness INT
通常情况下,我会推荐一些系统来约束只存在一个辅助表,但为了简单起见,我不考虑这一点

SELECT f.*, hd.length, hd.width, hb.radius, hb.thickness
FROM foods f
LEFT JOIN hotdogs hd
    ON hd.id = f.id
    AND f.foodtype = 'hotdog'
LEFT JOIN hamburgers hb
    ON hb.id = f.id
    AND f.foodtype = 'hamburger'
现在您将看到,如果对表名和表元数据的访问有一定的假设,可以从
selectdistinct foodtype from foods
中生成这样的代码(甚至对于运行速度非常慢的原型动态SQL)

问题在于,无论谁最终使用此查询的结果,都必须知道每当添加新表时,都会显示新列


因此,问题又回到了您的客户/数据消费者——它将如何处理不同类型的数据?不同的类型在同一组中意味着什么?如果它需要了解不同的类型,那么在添加新类型时只为每种类型编写不同的查询或更改手动查询的缺点是什么,因为这样的更改会产生相对影响?

不,您不能在
表1
中的每行连接到不同的表,即使使用@Cade Roux建议的动态SQL也不行

对于食物为“热狗”的行,您可以连接到
热狗表
中,对于食物的其他特定值,您可以连接到其他表中

SELECT * FROM table1 JOIN hotdog ON id = foodid WHERE food = 'hotdog'
UNION
SELECT * FROM table1 JOIN apples ON id = foodid WHERE food = 'apples'
UNION
SELECT * FROM table1 JOIN soups  ON id = foodid WHERE food = 'soup'
UNION 
...
这要求您知道食物的所有不同价值,并且所有相应的食物表都有兼容的列,以便您可以将它们合并在一起

你所做的就是所谓的多态关联。也就是说,
table1
中的外键引用多个“父”表中的行,具体取决于
table1
的另一列中的值。这是关系数据库程序员常见的设计错误

有关其他解决方案,请参见我对以下问题的回答:


在我的演示文稿和我的书中,我还介绍了多态关联的解决方案。

这似乎更像是一个设计问题-如果直到运行时才知道连接,您将如何强制执行引用完整性?Thnks for the replay。。。。我喜欢工会的解决方案,但我不确定能否实施。下面是细节。学生对某些字母提出请求,在“请求”表中,学生的数据和“字母类型”被保存。“字母类型”有10个不同的可能值。所以我有10个表,有特定的字母类型名称,比如。。表建议,表传输,所以我想找到一种方法,根据学生来信进行所有的“一选一”查询,调用特定的表并从中获取数据。@user1052347 Bill Karwin提供了几个设计链接。最终,由于每种类型的关联数据不同,实际的“SELECT*”不太可能起作用,因为每个表中的辅助信息将不同。您需要决定结果集的外观。在这一点上,您可以手工编写代码(甚至可能编写生成/动态SQL的代码-从而在一定程度上消除了更改模式时的维护问题)。我会在答覆中举出一个例子。