从多个表中选择某些字段而不进行任何连接

时间:2012-06-20 16:06:24

标签: mysql join

我有5个表(tbl1,tbl2,tbl3,tbl4,tbl5),它们都有相似的列,但没有共享fk。我需要按照时间戳的顺序编译项目列表(每个表都有一列)。我尝试过以下方法,但它没有用:

SELECT 
    t1.id, t1.name, t1.created,
    t2.id, t2.name, t2.created,
    t3.id, t3.name, t3.created,
    t4.id, t4.name, t4.created,
    t5.id, t5.name, t5.created
FROM tbl1 t1, tbl2 t2, tbl3 t3, tbl4 t4, tbl5 t5;

显然,上面的内容不会按时间戳列排序,但我需要在添加“ORDER BY”子句之前得到类似的内容。

有没有办法(不创建视图)运行一个从5个表中返回数据的查询(如果某些表为空,则为事件)?

2 个答案:

答案 0 :(得分:1)

听起来你正在寻找的是UNION ALL运营商。

SELECT t1.id, t1.name, t1.created FROM tbl1 t1
 UNION ALL 
SELECT t2.id, t2.name, t2.created FROM tbl2 t2
 UNION ALL 
SELECT t3.id, t3.name, t3.created FROM tbl3 t3
 UNION ALL 
SELECT t4.id, t4.name, t4.created FROM tbl4 t4
 UNION ALL 
SELECT t5.id, t5.name, t5.created FROM tbl5 t5
 ORDER BY 3

UNION ALL运算符基本上将查询结果连接到单个结果集中。请注意,每个表达式的表达式数量和数据类型必须在所有查询中都匹配。 (如果需要在其中一个查询中包含一个额外的列,则需要在其他查询中添加相应的表达式(甚至是虚拟占位符)。

当我进行这样的查询时,有时候包含一个表达式(列)有助于告诉我哪个源查询返回了行:

SELECT 't1' as source, t1.id, t1.name, t1.created FROM tbl1 t1
 UNION ALL 
SELECT 't2', t2.id, t2.name, t2.created FROM tbl2 t2
 UNION ALL 
SELECT 't3', t3.id, t3.name, t3.created FROM tbl3 t3
 UNION ALL 
SELECT 't4', t4.id, t4.name, t4.created FROM tbl4 t4
 UNION ALL 
SELECT 't5', t5.id, t5.name, t5.created FROM tbl5 t5
 ORDER BY 4

请注意,ORDER BY适用于整个结果集,您必须引用表达式按列位置排序。

答案 1 :(得分:0)

使用 UNION ALL

SELECT id, name, created FROM tbl1
UNION ALL
SELECT id, name, created FROM tbl2
UNION ALL
SELECT id, name, created FROM tbl3
UNION ALL
SELECT id, name, created FROM tbl4
UNION ALL
SELECT id, name, created FROM tbl5