如何根据另一个表的字段进行查询?

时间:2019-05-20 09:29:09

标签: mysql sql join

我有一个包含两列的表。   第一表      UID,TID

另一个表具有:    第二表      UID,TID,DiffColumn

鉴于用户的UID和DiffColumn,我需要查询用户的UID或TID是否在FirstTable中。 因此,我需要与SecondTable加入以获得TID。

我尝试使用以下查询:

     SELECT F.UID, F.TID FROM
      FirstTable F
     INNER JOIN 
     SecondTable S
     ON  F.UID = S.UID
     UNION
     SELECT F.UID, F.TID FROM
     FirstTable F
     INNER JOIN 
     SecondTable S ON  F.TID = S.TID
     WHERE S.DiffColumn= ''
     AND S.UID = ''

但是我认为我使这个查询过于复杂,而where子句仅适用于第二个select语句。 我怎样才能最好地简化它?

2 个答案:

答案 0 :(得分:0)

您可以在OR子句中使用ON来合并两个子查询。您还可以将WHERE子句的内容移动到ON

SELECT DISTINCT
    f.uid,
    f.tid
FROM 
    firsttable f
INNER JOIN 
    secondtable s ON s.uid = f.uid
                  OR s.tid = f.tid
                  AND s.tid = ''
                  AND s.uid = '';

答案 1 :(得分:0)

如果您要确定uid上的匹配优先于tid上的匹配的优先级,请使用两个left join

select f.uid, f.tid,
       coalesce(su.?, st.?) as ?  -- ? is a column you might want from secondtable
from firsttable f left join
     secondtable su
     on su.uid = f.uid left join
     secondtable st
     on st.tid = f.tid and
        st.diffcolumn = '' and
        st.uid = ''
where st.uid is not null or st.tid is not null;

或者,如果您不需要exists中的任何列,则可以只使用secondtable

select f.*
where exists (select 1
              from secondtable su
              where su.uid = f.uid
             ) or
      exists (select 1
              from secondtable st
              where st.tid = f.tid and
                    st.diffcolumn = '' and
                    st.uid = ''
     );

尽管您可以在相关性子句中使用or而不是两个exists,但我强烈建议不要这样做。 or子句和相关子句中的on是性能杀手。