我有三个表共享名为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 Table2
或select * from Table3
件事。
答案 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
一些注意事项:
如果没有"匹配" Table2
或Table3
中的ID值,则id
中的Table1
不会返回任何行。
在MySQL中,没有必要包含INNER
关键字,省略对语句的执行方式没有影响。
当查询引用多个表时,最好对所有列引用进行限定,而不仅仅是那些具有冲突列名的引用。 (当有人将一个名为x
的列添加到Table3时,您的查询将停止工作,并将开始抛出一个"不明确的列"错误。)
我更喜欢为每个表分配一个短别名,并使用别名限定列名。