我从两个表中选择了一个MYSQL查询。第二个表可能不一定具有与第一个表匹配的连接ID。我们以这两个为例:
++++++++++++++++++
table: t1
column: id
column: test_id
column: info
table t2
column: t2id
column: test_id
column: extra_info
++++++++++++++++++
我将以下这些行插入到表中(这只是伪目前):
insert into t1 values (1, 4, "asd")
insert into t1 values (2, 25, "dfg")
insert into t2 values (1, 25, "123")
现在我的目标是将两个表连接在一起,但我遇到了连接问题。如果第二个表(t2)似乎没有匹配的行,它会使原始表中的连接列为NULL吗?它为什么这样做?以下是一个示例查询:
SELECT * FROM `t1` LEFT JOIN `t2` ON (`t1.test_id` = `t2.test_id`) WHERE `t1.id` = 1;
现在我绝对没有问题,如果他们匹配,但由于某种原因,如果没有存在的行,那么来自t1的test_id被设置为NULL ...我的目标是加入这两个表,如果有什么加入。 编辑:如果没有任何东西要加入,那么我想通过将所有t2列设置为NULL或只返回t1数据来从t1返回数据。我是否需要执行子查询?如果是的话会是什么?谢谢:))
答案 0 :(得分:6)
使用INNER JOIN
。
SELECT * FROM `t1`
INNER JOIN `t2` ON (`t1.test_id` = `t2.test_id`)
WHERE `t1.id` = 1;
关于JOIN类型的文档:http://dev.mysql.com/doc/refman/5.7/en/join.html
答案 1 :(得分:1)
这是LEFT JOIN
的定义。即使只有连接的左半部分匹配,它也会返回行,如果需要,它会在右侧填充NULL
。
如果您只想获得相应右侧的行,请仅使用JOIN
代替LEFT JOIN
。
答案 2 :(得分:1)
加入时,建议不要使用“SELECT *”,特别是当您在多个表中具有类似命名的列时,因为这会引入歧义,并且您可能无法获得预期的结果。我建议改为:
SELECT t1.*, t2.t2id, t2.extra_info
FROM `t1`
LEFT JOIN `t2`
ON (`t1.test_id` = `t2.test_id`)
WHERE `t1.id` = 1;
答案 3 :(得分:0)
有多种不同类型的连接。我想你想要的是“内连接”,其中只返回具有匹配的行。查看http://www.w3schools.com/sql/sql_join.asp