0

我有一个从两个表中选择的 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 返回数据。 我需要做一个子查询吗?如果是这样,那会是什么?谢谢 :)

4

4 回答 4

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

于 2012-05-08T23:41:43.787 回答
1

这就是 的定义LEFT JOINNULL即使只有连接的左半部分匹配,它也会返回行,并在需要时填充右侧。

如果您只想获取对应右侧的行,请使用 justJOIN而不是LEFT JOIN.

于 2012-05-08T23:42:41.880 回答
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;
于 2012-05-08T23:43:37.233 回答
0

有多种不同类型的连接。我认为您想要的是“内部联接”,其中仅返回匹配的行。查看http://www.w3schools.com/sql/sql_join.asp

于 2012-05-08T23:42:34.237 回答