【问题标题】:MYSql left join two tables with column different valuesMYSql左连接两个具有不同列值的表
【发布时间】:2018-03-14 06:21:20
【问题描述】:

我有两张桌子
1:带有主键的 tbl_member_registration (mem_id)
2:tbl_phone 带外键(parent_code)

我想左连接这两个表,但是 tbl_phone parent_code 列有不同的值以前缀 mem_ 开头,如何连接这两个表?

【问题讨论】:

  • 为什么你的值在你的第二个表中有一个前缀?看来你应该先解决这个问题。您也有值具有cmp_* 的行。我猜这是一些多用途表,其中“parent_code”无法链接到不同的表?这是一个糟糕的设计。让每个实体类型都有自己的表。
  • 要应用连接,两个表的主键和外键类型值相似。您需要从 tbl_phone 的 parent_code 列中删除 mem_ 以使用 tbl_member_registration 应用左联接。
  • 你需要加入 SUBSTRING_INDEX 看看这个 - stackoverflow.com/questions/7481361/…
  • @MittulAtTechnoBrave - 不,最好在应用程序增长之前尽快解决糟糕的设计,并且你的应用程序中到处都是散落的骇人听闻的解决方案。我最近不得不处理一个包含这种确切类型表的大型数据库,而且一团糟。
  • 下次不用图片谢谢。相反,请参阅meta.stackoverflow.com/questions/333952/…

标签: php mysql


【解决方案1】:

您可以尝试以下加入:

SELECT *
FROM tbl_member_registration t1
LEFT JOIN tbl_phone t2
    ON t1.mem_id = CAST(SUBSTRING_INDEX(t2.parent_code, '_', -1) AS SIGNED);

Demo

接下来,您可能需要清理表,以便可以使用相等 = 来获得连接条件。当parent_code 列被包装在对SUBSTRING_INDEX 的丑陋调用中时,不可能在该列上使用索引。

【讨论】:

  • 我认为这是有道理的,我正要回答同样的问题。谢谢
  • @MittulAtTechnoBrave 我们也可以只使用 substring,但是 substring_index 让它更容易一些。
  • 正是蒂姆 .. 看准了。
【解决方案2】:

我还没有检查过,但你可以试试这个。

select *
from tbl_member_registration tmr join tbl_phone tp
on tp.parent_code = concat('mem_',tmr.mem_id)

更多参考详情:CONCAT

【讨论】:

    【解决方案3】:

    我希望这会帮助你,它的工作..

    SELECT *
        FROM tbl_member_registration t1
        INNER JOIN tbl_phone t2
            ON t1.mem_id = SUBSTR(t2.parent_code,5, 2);
    

    http://rextester.com/CSBZ60078

    【讨论】:

    • 您可以为此使用 SUBSTR 函数...它看起来很简单,并且了解它的工作原理,请查看我在上面附加的链接。
    【解决方案4】:
    select tbl_phone.*, tbl_member_registration.*
    from tbl_member_registration.mem_id 
    left join tbl_phone on tbl_member_registration.mem_id = (select substring(tbl_phone.parent_code, 5,2) );
    

    【讨论】:

    • 为什么要为这个操作使用子查询?您还应该解释您的解决方案是如何工作的。
    • 子查询仅用于获取 parent_code 上的 mem_id,因为 parent_code 在 id 的前面有名称。然后只运行其余的查询。
    • tbl_member_registration.mem_id = substring(tbl_phone.parent_code, 5,2) 可以正常工作
    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 2021-12-16
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    相关资源
    最近更新 更多