繁体   English   中英

JOIN之后选择多表

[英]multi table select after JOIN

我有4张桌子:

TB1:
+---------------+---------------------+----------+
| uniqueid      | datetime_entry      | field_0  |
+---------------+---------------------+----------+
| 1517326336.62 | 2018-01-30 17:32:16 | somedata |
| 1517326336.62 | 2018-01-30 17:32:22 | somedata |
| 1517326477.64 | 2018-01-30 17:34:37 | somedata |
+---------------+---------------------+----------+

TB2:
+---------------+---------------------+---------------------+--------+
| uniqueid      | datetime_inti       | datetime_end        | id_emp |
+---------------+---------------------+---------------------+--------+
| 1517326336.62 | 2018-01-30 17:32:16 | 2018-01-30 17:32:16 | 1      |
| 1517326336.62 | 2018-01-30 17:32:22 | 2018-01-30 17:32:16 | 2      |
| 1517326477.64 | 2018-01-30 17:34:37 | 2018-01-30 17:32:16 | 3      |
+---------------+---------------------+---------------------+--------+

TB3:
+---------------+----------+----------+----------+
| uniqueid      | field_1  | field_2  | field_3  |
+---------------+----------+----------+----------+
| 1517326336.62 | somedata | somedata | somedata |
| 1517326336.62 | somedata | somedata | somedata |
| 1517326477.64 | somedata | somedata | somedata |
+---------------+----------+----------+----------+

TB4:
+----+-----------+
| id | name      |
+----+-----------+
| 1  | Name_1    |
| 2  | F Name L. |
| 3  | F_name L. |
+----+-----------+

他们中的3个具有相同的uniqueID字段..因此,经过一些搜索,我发现我必须使用JOIN从3个表中获取所需的数据,现在我需要添加第4个表, 但是第4个表却没有。 t具有uniqueID字段。

SELECT *
FROM (
    TB1  
    LEFT JOIN TB2 USING (uniqueid) 
    LEFT JOIN TB3 USING (uniqueid)
    )
WHERE 
    TB1.datetime_entry>='2018-01-30 00:00:00' 
    AND TB1.datetime_entry<='2018-01-30 00:59:59' 
    AND TB1.new_status <>  'status1' 
    AND TB1.new_status <>  'status2' 
ORDER BY TB1.datetime_entry;

TB2中有一个名为id_emp的字段,现在我需要加入TB4并包含名称地址,因此,我需要在查询结果中返回名称和地址!

任何帮助将不胜感激。

提前致谢

您可以使用ON表达式JOIN表。 假设TB2有一个名为id_emp的字段,该字段是TB4 id字段的foreign key 然后以这种方式加入它:

SELECT *
FROM
    TB1 LEFT JOIN TB2
        USING (uniqueid) 
    LEFT JOIN TB3
        USING (uniqueid)
    LEFT JOIN TB4
        ON TB2.id_emp = TB4.id    -- JOIN table with ON expression
WHERE
    TB1.datetime_entry >= '2018-01-30 00:00:00' 
    AND TB1.datetime_entry <= '2018-01-30 00:59:59' 
    AND TB1.new_status <> 'status1' 
    AND TB1.new_status <> 'status2' 
ORDER BY TB1.datetime_entry;

我看到您正在使用LEFT JOIN ,这意味着TB1可能有记录,但是TB2TB3TB4没有必要的匹配记录。 如果所有表中始终都存在记录,则只需使用JOIN而不是LEFT JOIN 您可以在此处参考更多说明。

您应该对emp_id和id使用内部联接

  select TB1.uniqueid
    , TB1.datetime_entry
    , TB1field_0 
    , TB2.datetime_inti 
    , TB2.datetime_end  
    , TB2.id_emp 
    , Tb3.field_1
    , TB3.field_2
    , TB3.field_3
    , TB4.name
  FROM TB1 
  INNER JOIN TB2 ON TB1.uniqueid = TB2.uniqueid
  INNER JOIN TB3 ON TB1.uniqueid = TB3.uniqueid
  INNER JOIN TB4 ON TB2.id_emp = TB4.id

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM