JOIN 后多 table select

multi table select after JOIN

我有 4 个 table:

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 个 table 中获取我想要的数据,现在我需要添加第 4 个 table, 但是 第 4 个 table 没有 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 其中包括 nameaddress 所以,我需要在查询结果中return然后是姓名和地址!!

我们将不胜感激。

提前致谢

您可以 JOIN 带有 ON 表达式的表格。假设 TB2 有一个名为 id_emp 的字段,这个字段是 TB4foreign keyid 字段。然后这样加入:

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 中可能有记录,但 TB2TB3、[= 中没有必要的匹配记录17=]。如果记录始终存在于所有表中,只需使用 JOIN 而不是 LEFT JOIN。您可以参考更多解释 here.

您应该在 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