我知道我可以加入,但这不是我想要的。
我正在制作一个主要有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
答案 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
。