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 其中包括 name 和 address 所以,我需要在查询结果中return然后是姓名和地址!!
我们将不胜感激。
提前致谢
您可以 JOIN
带有 ON
表达式的表格。假设 TB2
有一个名为 id_emp
的字段,这个字段是 TB4
的 foreign key
到 id
字段。然后这样加入:
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
中可能有记录,但 TB2
、TB3
、[= 中没有必要的匹配记录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
我有 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 其中包括 name 和 address 所以,我需要在查询结果中return然后是姓名和地址!!
我们将不胜感激。
提前致谢
您可以 JOIN
带有 ON
表达式的表格。假设 TB2
有一个名为 id_emp
的字段,这个字段是 TB4
的 foreign key
到 id
字段。然后这样加入:
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
中可能有记录,但 TB2
、TB3
、[= 中没有必要的匹配记录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