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

标签 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”子句之前,我需要让类似的东西起作用。

有没有办法(无需创建 View )运行一个查询,该查询返回 5 个表中的数据(如果某些表为空,则发生事件)?

最佳答案

听起来您正在寻找的是 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 适用于整个结果集,并且您必须引用表达式以按列位置排序。

关于mysql - 从多个表中选择某些字段而不进行任何连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11123610/

相关文章:

mysql - 连接 MySQL 和 Informix 表

MYSQL 内部加入 2 个 ON 子句

php - 在 Mysql 中获取分组后列的聚合计数

mysql - 在 cakephp 中从一个模型连接两个模型

mysql - SQL 在单列上连接多个表

连接包含 Java HashMap 对象的 Kafka 流

php - 从 PHP 脚本调用 mySQL 存储过程 - 没有错误但不执行?

php - 从 ADDTIME(CURTIME(), '14400 hour' ) 格式中选择内容时出错

mysql - 使用子选择更改表

python - Pandas 加入 2 列