检索与JOIN共享公共字段的MySQL记录

时间:2014-09-30 14:01:31

标签: mysql join

我有三个表共享名为id的公共列。  (但尚未设置为foreign key

+----------------+    +----------------+    +----------------+
| Table 1        |    | Table 2        |    | Table 3        |
+----+-----+-----+    +----+-----+-----+    +----+-----+-----+
| id |  x  |  y  |    | id |  a  |  b  |    | id |  c  |  d  |
+----+-----+-----+    +----+-----+-----+    +----+-----+-----+
|  1 | 0.0 | 0.0 |    |  1 | 2.0 | 6.0 |    |  1 | 0.1 | 0.5 |
+----+-----+-----+    +----+-----+-----+    +----+-----+-----+
|  2 | 0.0 | 0.0 |    |  2 | 3.0 | 7.0 |    |  2 | 0.2 | 0.6 |
+----+-----+-----+    +----+-----+-----+    +----+-----+-----+
|  3 | 1.0 | 1.0 |    |  3 | 4.0 | 8.0 |    |  3 | 0.3 | 0.7 |
+----+-----+-----+    +----+-----+-----+    +----+-----+-----+
|  4 | 0.0 | 0.0 |    |  4 | 5.0 | 9.0 |    |  4 | 0.4 | 0.8 |
+----+-----+-----+    +----+-----+-----+    +----+-----+-----+

在这种情况下,如何获取包含id, x, y, a, b, c, d

的字段x = 0.0 and y = 0.0的记录

我期待结果:

+----+-----+-----+-----+-----+-----+-----+
| id |  x  |  y  |  a  |  b  |  c  |  d  |
+----+-----+-----+-----+-----+-----+-----+
|  1 | 0.0 | 0.0 | 2.0 | 6.0 | 0.1 | 0.5 |
+----+-----+-----+-----+-----+-----+-----+
|  2 | 0.0 | 0.0 | 3.0 | 7.0 | 0.2 | 0.6 |
+----+-----+-----+-----+-----+-----+-----+
|  4 | 0.0 | 0.0 | 5.0 | 9.0 | 0.4 | 0.8 |
+----+-----+-----+-----+-----+-----+-----+

我已经使用关键字join进行了Google搜索,但作为新手,我有点困惑。这个查询是这样的:

SELECT * FROM Table1
INNER JOIN Table2
ON Table1.id = Table2.id
INNER JOIN Table3
ON Table1.id = Table3.id
WHERE x = 0.0 and y = 0.0

做我期望的正确的事情?我没有看到某种select * from Table2select * from Table3件事。

3 个答案:

答案 0 :(得分:1)

如果您使用*而不是USING来表达联接,则可以使用ON来准确获取所需的列:

SELECT *
FROM Table1 INNER JOIN
     Table2
     USING (id) INNER JOIN
     Table3
     USING (id)
WHERE x = 0.0 and y = 0.0;

一个注意事项是使用浮点值。通常,这些并不准确。如果你使用小数,你应该没问题。但是数据库中的0.0可能真的是0.0000000000001,这会导致比较失败。

答案 1 :(得分:0)

你可以做到

SELECT Table1.*, Table2.*, Table3.* FROM Table1
INNER JOIN Table2
ON Table1.id = Table2.id
INNER JOIN Table3
ON Table1.id = Table3.id
WHERE x = 0.0 and y = 0.0

但你会在结果中获得3次id列。

要获得准确的结果,您需要明确选择所需的列:

SELECT Table1.id, Table1.x, Table1.y,
       Table2.a, Table2.b, 
       Table3.c, Table3.d
FROM Table1
INNER JOIN Table2
ON Table1.id = Table2.id
INNER JOIN Table3
ON Table1.id = Table3.id
WHERE x = 0.0 and y = 0.0

答案 2 :(得分:0)

是的,除了返回一些额外的列之外,您的查询将返回您指定的结果集。

以下是我将如何编写该查询的示例。

SELECT t.id
     , t.x
     , t.y
     , u.a
     , u.b
     , v.c
     , v.d
  FROM Table1 t
  JOIN Table2 u  ON u.id = t.id
  JOIN Table3 w  ON w.id = t.id
 WHERE t.x = 0.0
   AND t.y = 0.0

一些注意事项:

如果没有"匹配" Table2Table3中的ID值,则id中的Table1不会返回任何行。

在MySQL中,没有必要包含INNER关键字,省略对语句的执行方式没有影响。

当查询引用多个表时,最好对所有列引用进行限定,而不仅仅是那些具有冲突列名的引用。 (当有人将一个名为x的列添加到Table3时,您的查询将停止工作,并将开始抛出一个"不明确的列"错误。)

我更喜欢为每个表分配一个短别名,并使用别名限定列名。