【问题标题】:MYSQL join tables based on column data and table nameMYSQL根据列数据和表名连接表
【发布时间】:2011-12-31 13:52:07
【问题描述】:

我想知道这是否可能。

我想根据表 1 的数据连接 2 个表。 示例表 1 有 food 列,其数据为“hotdog”。

我有一张叫 hotdog 的桌子。

是否可以进行 JOIN 之类的操作。

SELECT * FROM table1 t join t.food on id = foodid

我知道它不起作用,但是,它甚至可能,周围有工作吗?。

提前致谢。

【问题讨论】:

  • 这似乎更像是一个设计问题 - 如果您直到运行时才知道您的联接,您将如何实施参照完整性?

标签: mysql join polymorphic-associations


【解决方案1】:

仅适用于动态 SQL。也可以左连接许多不同的表并根据类型使用 CASE,但这些表都必须提前知道。

如果我们更多地了解您想要实现的目标、您的设计目前的外观以及您最初选择该特定桌子设计的原因,那么推荐合适的设计会更容易。

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'

现在您将看到,在对表名和对表元数据的访问做出某些假设的情况下,可以从SELECT DISTINCT foodtype FROM foods 生成这样的代码(甚至可以动态生成非常慢的原型动态 SQL)。

问题在于,最终使用此查询结果的人必须知道,无论何时添加新表,都会出现新列。

所以问题又回到了数据的客户/消费者身上——它将如何处理不同的类型?不同类型在同一个集合中意味着什么?如果它需要了解不同的类型,那么考虑到这种更改的相对影响,为每种类型编写不同的查询或在添加新类型时更改手动查询有什么缺点?

【讨论】:

  • 感谢重播......我喜欢联合解决方案,我认为我不确定实施它。所以这里的细节。学生对一些信件提出请求,在“请求”表中,保存学生的数据和“信件类型”。 “字母类型”有 10 种不同的可能值。所以我有 10 个具有特定字母类型名称的表,例如.. 表推荐,表传输,所以我想要一种方法来对 1 个查询进行所有 SELECT 基于学生信,调用特定表并从中获取数据它。
  • @user1052347 Bill Karwin 提供了几个设计链接。最终,因为每种类型的关联数据不同,实际的“SELECT *”不太可能起作用,因为每个表中的辅助信息会有所不同。您需要决定您希望结果集是什么样子。那时,您可以手动编码(甚至可能是代码生成/动态 SQL - 从而在一定程度上消除了更改模式的维护问题)。我会在我的回答中举一个例子。
【解决方案2】:

不,您不能在table1 中的每行加入不同的表,即使像@Cade Roux 建议的那样使用动态 SQL 也不行。

您可以加入 hotdog 表以获取食物是“热狗”的行,并加入其他表以获取其他特定的食物值。

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 另一列中的值。这是关系型数据库程序员常见的设计错误。

有关替代解决方案,请参阅我的回答:

我还在我的演示文稿Practical Object Oriented Models In SQL 和我的书SQL Antipatterns: Avoiding the Pitfalls of Database Programming 中介绍了多态关联的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 2021-11-10
    相关资源
    最近更新 更多