我有 3 个表,我想将它们合并/连接成一个,我尝试了不同的方法,例如连接、左/右连接,但不知怎的,我在编写的语句数量中迷失了自己,所以我无法让它正常工作。
我想将测量中的名称映射到measurement_data_points中的measurement_id,然后映射data_points_id measurement_data_points 中的 到 measurement_point
中的 id我在底部添加了一个虚构的结果,以便给出清晰的理解。
我的表格:
+-------------------------+
| Tables_in_db_datapoints |
+-------------------------+
| measurement |
| measurement_data_points |
| measurement_point |
+-------------------------+
测量表
mysql> select * from measurement;
+----+----------------------+
| id | name |
+----+----------------------+
| 1 | identifiedNeed |
| 2 | identifiedBackground |
| 3 | identifiedGoal |
+----+----------------------+
measurement_data_points 表
mysql> select * from measurement_data_points;
+----------------+----------------+
| measurement_id | data_points_id |
+----------------+----------------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 1 | 4 |
| 2 | 5 |
| 2 | 6 |
| 2 | 7 |
| 2 | 8 |
| 3 | 9 |
| 3 | 10 |
| 3 | 11 |
| 3 | 12 |
+----------------+----------------+
测量点表
+----+------------+-----+----------+--------+
| id | date | f1 | precison | recall |
+----+------------+-----+----------+--------+
| 1 | 2017-11-19 | 0.3 | 0.5 | 0.2 |
| 2 | 2017-11-12 | 0.7 | 0.4 | 0.15 |
| 3 | 2017-11-15 | 0.5 | 0.3 | 0.1 |
| 4 | 2017-11-18 | 0.6 | 0.2 | 0.05 |
| 5 | 2017-11-19 | 0.2 | 0.4 | 0.2 |
| 6 | 2017-11-12 | 0.4 | 0.3 | 0.15 |
| 7 | 2017-11-15 | 0.5 | 0.2 | 0.1 |
| 8 | 2017-11-18 | 0.6 | 0.1 | 0.05 |
| 9 | 2017-11-19 | 0.1 | 0.4 | 0.2 |
| 10 | 2017-11-12 | 0.4 | 0.3 | 0.15 |
| 11 | 2017-11-15 | 0.3 | 0.2 | 0.1 |
| 12 | 2017-11-18 | 0.2 | 0.1 | 0.05 |
+----+------------+-----+----------+--------+
我希望结果主要是这样的:
+-----------------------+----------------+------------+-----+----------+
| measurement_id | data_points_id | date | f1 | precison | recall |
+-----------------------+----------------+------------+-----+----------+
| identifiedNeed | 1 | 2017-11-19 | 0.3 | 0.5 | 0.2 |
| identifiedNeed | 2 | 2017-11-12 | 0.7 | 0.4 | 0.15 |
| identifiedNeed | 3 | 2017-11-15 | 0.5 | 0.3 | 0.1
| identifiedNeed | 4 | 2017-11-18 | 0.6 | 0.2 | 0.05 |
| identifiedBackground | 5 | 2017-11-19 | 0.2 | 0.4 | 0.2 |
| identifiedBackground | 6 | 2017-11-12 | 0.4 | 0.3 | 0.15 |
| identifiedBackground | 7 | 2017-11-15 | 0.5 | 0.2 | 0.1 |
| identifiedBackground | 8 | 2017-11-18 | 0.6 | 0.1 | 0.05 |
| identifiedGoal | 9 | 2017-11-19 | 0.1 | 0.4 | 0.2 |
| identifiedGoal | 10 | 2017-11-12 | 0.4 | 0.3 | 0.15 |
| identifiedGoal | 11 | 2017-11-15 | 0.3 | 0.2 | 0.1 |
| identifiedGoal | 12 | 2017-11-18 | 0.2 | 0.1 | 0.05 |
+-----------------------+----------------+------------+-----+----------+
如果这不起作用,那么这也有效
+----------------+----------------+------------+-----+----------+--------+
| measurement_id | data_points_id | date | f1 | precison | recall |
+----------------+----------------+------------+-----+----------+--------+
| 1 | 1 | 2017-11-19 | 0.3 | 0.5 | 0.2 |
| 1 | 2 | 2017-11-12 | 0.7 | 0.4 | 0.15 |
| 1 | 3 | 2017-11-15 | 0.5 | 0.3 | 0.1 |
| 1 | 4 | 2017-11-18 | 0.6 | 0.2 | 0.05 |
| 2 | 5 | 2017-11-19 | 0.2 | 0.4 | 0.2 |
| 2 | 6 | 2017-11-12 | 0.4 | 0.3 | 0.15 |
| 2 | 7 | 2017-11-15 | 0.5 | 0.2 | 0.1 |
| 2 | 8 | 2017-11-18 | 0.6 | 0.1 | 0.05 |
| 3 | 9 | 2017-11-19 | 0.1 | 0.4 | 0.2 |
| 3 | 10 | 2017-11-12 | 0.4 | 0.3 | 0.15 |
| 3 | 11 | 2017-11-15 | 0.3 | 0.2 | 0.1 |
| 3 | 12 | 2017-11-18 | 0.2 | 0.1 | 0.05 |
+----------------+----------------+------------+-----+----------+--------+
最佳答案
您请求的查询非常简单。它使用与其他两个表连接的“主”表(测量)。 “联接”是一种使用一个或多个字段链接两个表的方法。 例如,在您的情况下,您可以使用以下语法(在 SELECT 命令内)使用字段measurement_id 将测量与measurement_data_points 连接起来:
...
FROM measurement A
LEFT JOIN measurement_data_points B ON A.measurement_id= B.measurement_id
连接后,您可以在 SELECT 中使用两个表的每个字段。例如。
...
SELECT measurement.name
, measurement_data_points.data_points_id
...
把所有这些放在一起,应该很简单:
SELECT measurement.measurement_id
, measurement_data_points.data_points_id
, measurement_point.date
, measurement_point.f1
, measurement_point.precison
, measurement_point.recall
FROM measurement
LEFT JOIN measurement_data_points ON measurement.measurement_id= measurement_data_points.measurement_id
LEFT JOIN measurement_point ON measurement_data_points.data_points_id = measurement_point.id ;
使用测量名称而不是测量 ID 进行查询:
SELECT measurement.name
, measurement_data_points.data_points_id
, measurement_point.date
, measurement_point.f1
, measurement_point.precison
, measurement_point.recall
FROM measurement
LEFT JOIN measurement_data_points ON measurement.measurement_id= measurement_data_points.measurement_id
LEFT JOIN measurement_point ON measurement_data_points.data_points_id = measurement_point.id ;
提示:所有这些都是非常简单的查询,如果您只需花一些时间阅读有关 SQL SELECT 和 SQL JOIN 的内容(在 Internet 上查找),您将能够自己满意地进行这样的查询。
关于Java Spring SQL如何将3个表组合/连接成一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47304711/