仅当字段具有特定值时才加入mysql

仅当字段具有特定值时才加入mysql,mysql,join,Mysql,Join,我正在尝试在某些条件下使用join获取表。我的桌子是: tab_registrations -------------------------------------------- reg_id |familyid| familyname | parent_id | | | | | -------|--------|-------------|-----------|

我正在尝试在某些条件下使用join获取表。我的桌子是:

        tab_registrations
    --------------------------------------------
    reg_id |familyid| familyname  | parent_id |
           |        |             |           |
    -------|--------|-------------|-----------|
    1      |  2     |   null      | null      |
    -------|--------|-------------|-----------|
    2      | others |    abc      | 3         |
    -------|--------|-------------|-----------|
    3      | 3      |   null      |   null    |
    -------|--------|-------------|-----------|
    4      | others |  def        |   2       |
    -------|--------|-------------|-----------|

    tab_family
    -------------------------------------
    family_id | family_name | parent_id |
              |             |           |
    -------------------------------------
    1         | tyu         |   0       |
    -------------------------------------
    2         | xyz         |   1       |
    -------------------------------------
    3         | mno         |   2       |
    -------------------------------------
我想在以下位置连接这些表:

  • 如果tab_registrations.family不等于null,则从tab_family中选择相应的父项id

    SELECT tab_registration.*,tab_family.family_id,tab_family.parent_id
     FROM `tab_registration`
     join tab_family  on tab_registration.family_id = tab_family.family_id
     WHERE reg_id = 1
    
  • 如果tab_registrations.family等于“others”,则选择tab_registrations.familyname和tab_registrations.parent_id

  • 当我尝试上面的查询时,如果tab_registrations.family='others',则不会获取任何行


    我怎样才能做到这一点?有人能帮我吗?

    更改为
    左连接
    ,条件是
    选项卡注册。familyid
    不等于
    其他
    。此外,您还可以使用条件
    CASE..WHEN
    语句获取
    familyname
    parent\u id

    SELECT tr.*,
           CASE WHEN tr.familyid = 'others' THEN tr.familyname 
                ELSE tf.family_name
           END AS familyname, 
           CASE WHEN tr.familyid = 'others' THEN tr.parent_id 
                ELSE tf.parent_id
           END AS parent_id
    FROM tab_registration tr
    LEFT JOIN tab_family tf
      ON tr.family_id = tf.family_id AND 
         tr.familyid <> 'others'
    WHERE tr.reg_id = 1
    
    选择tr.*,
    当tr.familyid='others'然后tr.familyname时的情况
    ELSE tf.family_name
    以familyname结尾,
    当tr.familyid='others'然后tr.parent\u id时的情况
    ELSE tf.parent_id
    作为父项结束\u id
    从tab_注册tr
    左连接选项卡\u族tf
    在tr.family_id=tf.family_id和
    tr.familyid‘其他人’
    其中tr.reg_id=1
    

    对于多表查询,为了代码的清晰性和可读性,最好使用别名。

    此查询可能有用

    SELECT tr.*,tf.family_id,tf.parent_id,
     IF(tr.familyid='others',tr.familyname,tf.family_name) as fname
     IF(tr.familyid='others',tr.parent_id,tf.parent_id) as parentId
     FROM `tab_registration` tr
     left join tab_family tf on tr.family_id = tf.family_id
    

    哪里是
    标签注册中的
    家庭id
    。您要精确匹配的内容。预期的输出是什么?family\u id是tab\u注册中的familyid。。看我的edit@tim我想要整个
    标签注册
    。仅当tab_registrations.familyid不是“其他”时,我才想加入。
    选择tab_registration.*,tab_family.family_id,tab_registration中的tab_family.parent_id加入tab_registration.familyid=tab_family.family_id,其中tab_registration.reg_id=1和tab_registration.familyname不为NULL
    。尝试此操作。查询正在运行。。!!但是当
    tr.familyid='others'
    时,结果包含
    tr.familyname
    twice@Aishwaryas有什么影响吗?问题在于
    tr.*
    。如果
    familyid
    不等于
    others
    yes,是否要获取
    tab\u registration
    表的所有列,或者用
    tab\u family
    替换它们。。我得到了它。。!你又是我的救星了@MadhurBhaiya