2012-04-26 53 views
1

我正在开发知识产权管理系统,我在数据库中有两个表格 - 商标和设计。JOIN中的MySQL条件表名称

然后我有反对派这样的事情。这意味着,如果其他人拥有商标或设计,看起来就像我们的客户一样,经理可能会产生新的反对意见。

例如,我有3个表:

商标:

id 
name 

设计:

id 
name 

oppostion:

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列,但后来我意识到,我不知道这是否是可能会查询表名称,首先,它是一个不错的设计。

但我在这里受到伤害,没有出现在我的脑海里。那么有没有人有任何想法如何处理它?

回答

3

也许是这样的:

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' 
+0

感谢,这正是我一直在寻找! – 2012-04-26 11:08:13

+0

@KuH也可以比较我的答案中的查询性能。我不完全确定,但我觉得我的查询应该更快,返回相同的结果。 – 2012-04-26 11:16:24

+1

@KuH:没问题。记住投票你认为是好的答案。这给了我们一种温暖的模糊感觉:P。 – Arion 2012-04-26 11:17:20

0
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将结果统一到一个结果集中。