如何通过SELECT连接mysql中的两个表

时间:2011-07-06 21:33:49

标签: mysql

所以我有两张桌子。两者都有五个共同的列(roomname,usercount,userlimit,topic,extra),同时每个表还有其他不相关的列。

我想要的是使用SELECT并检索TableA + TableB的组合,其中'roomname'值在结果中必须是唯一的。

因此,如果TableA包含一个roomname ='room1'的行,而TableB包含一个roomname ='room1',请优先选择TableA中的一个,并且不要添加TableB中的项。请记住,只有'roomname'值才会相同。 usercount,userlimit,topic,extra将不同于TableA到TableB,即使'roomname'值是相同的。

4 个答案:

答案 0 :(得分:1)

SELECT roomname, usercount, userlimit, topic, extra
FROM TableA

UNION ALL

SELECT roomname, usercount, userlimit, topic, extra
FROM TableB
WHERE roomname NOT IN
    ( SELECT roomname FROM TableA )

答案 1 :(得分:0)

SELECT roomname, usercount, userlimit, topic, extra
FROM TableA

UNION

SELECT roomname, usercount, userlimit, topic, extra
FROM TableA

默认情况下,MySQL中的联合查询确实“不同”并消除了重复行(又名UNION DISTINCT)。如果您想获得重复的行,那么您可以改为UNION ALL


好的,既然你现在说只有房间名称在表格之间是常见/重复的,那么如下:

select tableA.*, tableB.*
from tableA
join tableB on tableA.roomname = tableB.roomname
where (tableA.usercount <> tableB.usercount) or (tableA.userlimit <> tableB.userlimit)
   or (tableA.topic <> tableB.topic) or (tableA.extra <> tableB.extra)

这会从两个表中返回所有行,它们共享相同的房间名,但在一个或多个其他字段中存在差异。如果您只想在这些字段上显示完全相同的重复项,请将<>更改为=


mod第2部分

select tableB.*
from tableB
left join tableA on tableA.roomname = tableB.roomname
where tableA.roomname is null

这将返回表B中所有记录,其中roomname字段在表A中没有匹配



在OP的更新解释之后:

SELECT roomname, usercount, userlimit, topic, extra
FROM TableA

UNION ALL

SELECT roomname, usercount, userlimit, topic, extra
FROM TableB
WHERE roomname NOT IN
    ( SELECT roomname FROM TableA )

答案 2 :(得分:0)

您尝试做的事情听起来更像UNION而不是JOIN。前者只是给你一个组合的结果集,而后者执行一个SQL JOIN,它修改了结果集。

要合并两个查询的结果,UNION SELECT查询,例如

(SELECT roomname, usercount, userlimit, topic, extra
    FROM TableA)
UNION DISTINCT
(SELECT roomname, usercount, userlimit, topic, extra
    FROM TableB);

UNION DISTINCT消除了重复项。我手边没有服务器来测试语法,但是对manual来说,它应该是正确的。

答案 3 :(得分:0)

SELECT roomname, usercount, userlimit, topic, extra
FROM
     (
(SELECT roomname, usercount, userlimit, topic, extra
    FROM TableA)
UNION
(SELECT roomname, usercount, userlimit, topic, extra
    FROM TableB)
) AAA
GROUP BY roomname

请注意我不使用任何聚合函数,这将使查询仅显示每个组的第一个结果(在这种情况下,假设来自UNION中的第一个SELECT。

@ypercube解决方案也很好(比我的更容易理解)。 But due to a bug in MySQl,我认为我的解决方案效率更高(你需要检查一下)。