mysql - 我可以在 JOIN 中使用 UNION 吗?

标签 mysql sql

我每天都使用以下表格(不用理会名称,这些只是示例):

  • 书籍
  • 货架
  • 注释

出于某种原因,我必须创建另一个表进行归档。因此有 archive_books、archive_shelves 和 archive_notes。

应用程序中有一个“搜索”界面,有时我想在存档表中搜索。但是在结果中我必须显示所有 3 个表中的数据。因为任何人都可以搜索,所以我必须在两个表(存档表和普通表)中运行查询。

没有存档表的搜索可以像这样运行:

SELECT * FROM books b
LEFT JOIN shelves s ON s.id = b.shelf_id
LEFT JOIN notices n ON n.book_id = b.id
WHERE smt="%search_query%";

对书架进行存档是指将所有图书放入给定书架,并且所有通知都引用给定书架中的图书副本到存档表并从源表中删除。

那么,在存档和非存档表中进行搜索是否可以像这样?

SELECT * FROM (SELECT * FROM books UNION SELECT * FROM archive_books) b
LEFT JOIN (SELECT * FROM shelves UNION SELECT * FROM archive_shelves) s ON s.id = b.shelf_id
LEFT JOIN (SELECT * FROM notices UNION SELECT * FROM archive_notices) n ON n.book_id = b.id
WHERE smt="%search_query%";

我希望我能正确地写下我的问题! :)

最佳答案

您当然可以这样做,但是我想查看查询计划以了解它的效率如何。 一种替代方法是为每对创建一个 View :

create view AllBooks as select * from books union select * from archiveBooks;

..然后在搜索查询中使用该 View 。

干杯-

关于mysql - 我可以在 JOIN 中使用 UNION 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20919597/

相关文章:

mysql - 查询生成器 - codeigniter

mysql - 如何一次只更新几行? (多表语法)

sql - 字符串列的索引

php - Laravel:排除对多对多关系的过滤

mysql查询: match against using wildcard

mysql - 对象引用未设置为对象的实例

javascript - Mysql 根据另一个下拉选项填充下拉列表

sql - PostgreSQL 可以对加密记录进行查询吗?

sql - 为大型 Web 应用程序选择什么数据库策略

php - Laravel - 删除 SQL 数据库中的重复行