【问题标题】:MySQL conditional table name in JOINJOIN 中的 MySQL 条件表名
【发布时间】:2012-04-26 10:43:05
【问题描述】:

我正在开发知识产权管理系统,我在数据库中有 2 个表 - 商标和设计。

那我就有反对意见了。这意味着,如果其他人拥有看起来像我们客户的商标或设计,经理可以提出新的反对意见。

例如,我有 3 个表:

商标:

id 
name

设计:

id
name

反对:

id
name
object_id
object_table

我不知道,与什么表对立有关,但我应该有可能进行这种查询:

SELECT id, name, opposition_object.name FROM opposition
LEFT JOIN (trademark|design) as opposition_object on opposition.object_id =   (trademark|design).id

首先,我考虑将表名存储为对立表的 object_table 列,但后来我意识到我不知道是否可以查询表名,首先,这肯定是一个糟糕的设计。

但是我在这里被击中了,我什么都没有想到。那么有人知道如何处理吗?

【问题讨论】:

    标签: mysql tablename


    【解决方案1】:

    可能是这样的:

    SELECT 
        id, 
        name, 
        COALESCE(trademark.name,design.name) AS object_name
    FROM 
        opposition
        LEFT JOIN trademark 
            on opposition.object_id =   trademark.id
            AND trademark.object_table ='trademark'
        LEFT JOIN design
            on opposition.object_id =   design.id
            AND design.object_table ='design'
    

    【讨论】:

    • 谢谢,这正是我想要的!
    • @KuH 也将性能与我的回答中的查询进行比较。我不完全确定,但我觉得我的查询应该更快,返回相同的结果。
    • @KuH:没问题。记得给你认为好的答案投票。这给了我们一种温暖的模糊感:P。
    • @Shedal:UNION 谁能比 2 left joins 更快?
    • @Arion:我很乐意为你的回复投票,但我是新来的,所以我不需要这方面的声誉 :-)
    【解决方案2】:
    SELECT opposition.id, opposition.name, trademark.name AS object_name
    FROM opposition
    LEFT JOIN trademark
      ON opposition.object_id = trademark.id
    WHERE opposition.object_table = 'trademark'
    
    UNION
    
    SELECT opposition.id, opposition.name, design.name AS object_name
    FROM opposition
    LEFT JOIN design
      ON opposition.object_id = design.id
    WHERE opposition.object_table = 'design'
    

    这会发出两个查询:一个加入trademark 表,另一个加入design。然后使用UNION将结果统一为一个结果集。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-17
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 2014-09-13
      • 2013-05-14
      相关资源
      最近更新 更多