在JOIN之后选择多表

时间:2018-03-25 12:10:50

标签: mysql sql-standards

我有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个表格没有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 ,其中包括 名称 地址 因此,我需要在查询结果中返回名称和地址!!

任何帮助将不胜感激。

提前致谢

2 个答案:

答案 0 :(得分:0)

您可以JOINON表。假设TB2有一个名为id_emp的字段,此字段是foreign key的{​​{1}}到id字段。然后以这种方式加入:

TB4

我发现您使用的是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的记录,但TB1TB2,{{1}中不存在必要的匹配记录}。如果记录始终存在于所有表中,则只需使用TB3而不是TB4。您可以参考更多解释here

答案 1 :(得分:0)

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