【问题标题】:How to join tables when primary key of one table is not the same as but contained within the primary key of the other table?当一张表的主键与另一张表的主键不同但包含在另一张表的主键中时,如何连接表?
【发布时间】:2013-02-08 16:10:02
【问题描述】:

我正在使用(但尚未设计)的数据库具有奇怪的结构,因为一个表行的主键 (id) 包含在另一个表行的主键中。例如,如果 table1 有一个 id 为“933”的行,table2 将有一个 id 类似但前缀为单词的行,例如'something933'。

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

这是基本查询,但是因为 table1.id 的内容类似于“933”而 table2.id 类似于“something933”,所以我需要 WHERE table1.id = table2.something+id 之类的内容。

有没有办法在一个查询中连接这些表?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    是的,您可以这样做,但这是一个非常糟糕的设计。此外,您的查询格式错误,因为您确实应该指定连接条件,而不是为此使用 WHERE 子句。在不指定连接条件的情况下按照您的方式进行操作,将为您提供表的笛卡尔积,然后您将根据您的条件进行过滤。所以你可能会使用类似的东西:

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

    当然,您将无法使用 table1 上的索引进行连接(因此设计不佳)。

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

    【讨论】:

    • 是的,如果可以的话,我想我会另辟蹊径,从 table2.id 中删除“某些东西”。那时也可能有一个计算索引。当然,那是在我伤害了对我这样做的人之后......
    • 这太棒了,迈克,谢谢。至少,这将是一个很好的临时解决方案;稍后也许我会看看是否值得更改设计的麻烦,但这只是我接手的一个小项目。
    【解决方案2】:
    SELECT * FROM table1, table2 WHERE table2.id LIKE '%'+table1.id
    

    【讨论】:

      【解决方案3】:

      我相信你想使用 LIKE 词:

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

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

      How to use an user variables in MySQL LIKE clause?

      【讨论】:

      • 这有一个“额外”匹配的严重缺点。考虑table1.id = 933table2.id = 'something3933' 的情况。
      • 好点。如果后续文本始终相同,我将只使用 CONCAT 而将 LIKE 全部省略。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 2023-03-25
      相关资源
      最近更新 更多