【发布时间】:2011-06-16 12:16:20
【问题描述】:
假设我的 MySQL 数据库中有两个表 - “Table1”和“Table2”。 “Table1”中的“id”主键(auto_increment)是“Table2”中的引用键-“tab_id”。
一个“Table1”行可能有零个或多个“Table2”行。
现在我正在尝试对“Table2”中的一列进行搜索,例如“email”列,或者在“Table1”中的一列中搜索“address”并打印“Table1”行值。
我看到有 3 种可能性: 1.加入 2.子查询 3.联合
1 加入
SELECT *
FROM Table1 t1, Table t2
WHERE t1.id = t2.tab_id
AND (t1.address like '%str%' OR t2.email like '%str%');
-- 这很好用,但是当“Table2”中没有与“Table1”相关的行时.. JOIN 将失败,因此输出不一致。
2 子查询
SELECT *
FROM Table1 t1
WHERE t1.address like '%str%'
OR t1.id IN (SELECT t2.tab_id
FROM Table2 t2
WHERE t2.email like '%str%');
-- 这很好用,但是当“Table2”中有两行(比如 5K)时,查询会非常慢:(
3 联合
SELECT 'relevant_columns'
FROM Table1 t1, Table t2
WHERE t1.id = t2.tab_id
AND (t1.address like '%str%' OR t2.email like '%str%')
UNION
SELECT 'relevant_columns'
FROM Table1 t1
WHERE t1.address like '%str%'
ORDER BY relevant_column
-- 这很好用,可以用类似的 UNION 创建一个视图,就可以了。
现在,我的问题是什么是正确的方法...可以始终调用 UNION 吗?
MySQL 引擎:MyISAM
【问题讨论】:
-
不确定我是否理解您要执行的操作,但这听起来像是外部联接的工作,而不是联合。也许调查一下?
标签: mysql