在MySQL select语句中组合2个表

时间:2011-05-28 11:03:20

标签: php mysql select join

我知道我可以加入,但这不是我想要的。

我正在制作一个主要有2个表的实时聊天系统:主聊天表(称之为表a),然后是一个mod表(称之为表b)。如果用户被暂停,该频道的消息超过100,或者超过1周,消息将从主聊天表移动到mod表。

我将聊天消息的ID作为ID(主要)存储在主聊天表上,并将其作为modID存储在mod表中。

我正在做的是为我的Mod制作一个单独的页面,我希望能够将这两个表合并为一个区域,但我希望它们按各自的表排序。

所以我们说我们有以下内容:

主表ID:1,2,4 Mod表ID:3

我希望我的结果显示1,2,3,4无论ID在哪个表中。

非常感谢任何帮助!

编辑:我得到了答案,这就是我过去常常这样做的:

SELECT ab.* FROM 
  ((SELECT ID as table_id FROM a 
    WHERE roomID = 'newUsers' ORDER BY ID ASC) 
UNION ALL 
  (SELECT chatID as table_id FROM b 
    WHERE roomID = 'newUsers' ORDER BY chatID ASC)) ab 
ORDER BY ab.table_id 

1 个答案:

答案 0 :(得分:5)

在子选择中使用UNION

SELECT ab.* FROM (
  SELECT 1 as table_id, * FROM a
UNION ALL
  SELECT 2 as table_id, * FROM b
) ab
ORDER BY ab.id

如果您希望表A的结果在表B之前显示,请将查询更改为:

SELECT ab.* FROM (
  SELECT 1 as table_id, * FROM a
UNION ALL
  SELECT 2 as table_id, * FROM b
) ab
ORDER BY ab.table_id, ab.id

一些背景
UNION ALL会将两个结果集合并为一个结果集 UNION会做同样的事情,但会消除重复的行 这需要花费时间并减慢速度,所以如果你知道没有重复记录(或者你不关心重复)使用UNION ALL

另请参阅:http://dev.mysql.com/doc/refman/5.5/en/union.html