代码之家  ›  专栏  ›  技术社区  ›  Aishwaryas

仅当字段具有特定值时,MySQL联接

  •  2
  • Aishwaryas  · 技术社区  · 6 年前

    我正试图在某些条件下用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       |
        -------------------------------------
    

    我想在以下位置加入这些表:

    1. 如果tab_registrations.family不等于空,则从tab_family中选择相应的父级\u 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
      
    2. 如果tab“registrations.family”等于“others”,则选择tab“registrations.familyname”和tab“registrations.parent”id。

    当我尝试上述查询时,如果tab ou registrations.family='others',则不会提取任何行。

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

    2 回复  |  直到 5 年前
        1
  •  2
  •   Madhur Bhaiya    6 年前

    改为 LEFT JOIN 条件是 tab_registration.familyid 不等于 others . 此外,还可以使用条件 CASE..WHEN 语句以获取 familyname parent_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
    

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

        2
  •  -2
  •   Chirag    5 年前

    此查询可能有用

    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