2013-02-22 61 views
0

我正在使用的数据库(但没有设计)有一个奇怪的结构,其中一个表的行的主键(id)包含在另一个表的行的主键内。例如,如果table1有一个id为'933'的行,table2将有一个带有一个id的行,但前缀为一个单词,例如, 'something933'。当一个表的主键与另一个表的主键不同但包含在另一个表的主键中时如何连接表?

SELECT * FROM table1, table2 WHERE table1.id = table2.id 

这就是基本的查询,但由于table1.id的内容就像是“933”和table2.id就像“something933”,我需要的东西等,其中table1.id = table2.something + ID。

有什么办法可以在单个查询中连接这些表吗?

回答

2

是的,你可以做到这一点,但是这是一个非常糟糕的设计。此外,您的查询格式不正确,因为您应该真正指定连接条件,而不是使用WHERE子句。按照您所做的方式进行操作,无需指定连接条件,即可为您提供表格的笛卡尔积,然后过滤出您的条件。所以,你可以使用这样的:

SELECT * FROM table1 
INNER JOIN table2 ON CONCAT('something', table1.id) = table2.id 

当然,你会失去使用表1上的指数为加入的能力(因此不好的设计部分)。

如果可以的话,我只需更新table2上的那些id以删除前缀。

+0

是啊,我想我会走另一条路,如果可以的话,从table2.id中除去“某些东西”。可能也可能有一个计算的指标。当我伤害到对我做过这些事情的人之后,那个过程...... – 2013-02-22 22:53:35

+0

太棒了,迈克,谢谢。至少,这将是一个很好的临时解决方案;稍后或许我会看看改变设计的麻烦是否值得,但这只是我接手的一个小项目。 – redburn 2013-02-22 23:13:28

0

我相信你想使用的,如Word:

SELECT * FROM table1, table2 WHERE table2.id LIKE CONCAT('%', table1.id, '%'); 

这里有一个类似的问题和答案:

How to use an user variables in MySQL LIKE clause?

+1

这有一个'额外'匹配的严重缺点。考虑'table1.id = 933'和'table2.id ='something3933''的情况。 – spencer7593 2013-02-22 22:51:34

+0

好点。如果前面的文本总是相同的,我只需要使用CONCAT,而不用像LIKE一样。 – LNendza 2013-02-22 22:56:34

0
SELECT * FROM table1, table2 WHERE table2.id LIKE '%'+table1.id 
相关问题