mysql 查询连接/子查询/联合

标签 mysql

假设我的 MySQL 数据库中有两个表 - “Table1”和“Table2”。 “Table1”中的“id”主键(auto_increment)是“Table2”中的引用键 - “tab_id”。

一个“Table1”行可以有零个或多个“Table2”行。

现在,我尝试对“Table2”中的一列(例如“电子邮件”列)或“Table1”中的一列(例如“地址”)进行搜索,并打印“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 的 View ,就可以完成工作。

现在,我的问题是什么是正确的方法......总是调用 UNION 可以吗?

MySQL 引擎:MyISAM

最佳答案

SELECT *
  FROM Table1 t1
  LEFT JOIN Table t2 ON t2.tab_id = t1.id
 WHERE t1.address like '%str%'
    OR t2.email like '%str%';
  1. 您需要执行LEFT JOIN。当您像您一样从两个表创建 FROM 时,它会用作 INNER JOIN (如果没有 WHERE 子句,则为 CROSS JOIN),这意味着输出仅显示两个表中都匹配的行。使用 LEFT JOIN 时,您表示希望左表 (t1) 中的所有行与右表 (t2) 中的匹配行。如果 t2 中没有匹配项,则使用 null

  2. 您可以使用子查询,但如您所见,这不是最佳选择

  3. 这里的UNION不会给你带来任何优势。 UNION 对于将具有相同列的数据集合并在一起非常有用。

编辑

如果您在 JOIN 方面遇到问题,因为某些 Table1 行没有出现,那么您需要 LEFT JOIN。需要很长时间的事实是另一个问题。这些表一点也不大,所以我想您需要对这些表进行一些索引工作。

如果您需要有关union的帮助,您需要告诉我哪些是relevant_columns,因为它们必须具有相同的列数、相同的类型和相同的序列。 您可以优化不带连接的union,具体取决于t2.email 匹配时您想要输出的内容。这是一个例子

SELECT t1.id, t1.address, null as email
  FROM Table1 t1 
 WHERE t1.address like '%str%'
 union
SELECT t2.tab_id as id, null as address, t2.email
  FROM Table t2
 WHERE t2.email like '%str%';

关于mysql 查询连接/子查询/联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6371628/

相关文章:

php - 你如何使用mysql join来过滤掉整行?

sql - 多个表中的唯一 ID [MySQL]

mysql COUNT DISTINCT 多列与 WHERE

MySQL,如何查询区间?

php - PHP MySQL中日期和时间的计算和echo

MySQL 数据库损坏

mysql - 如果我想在一个参数中传递多个值,如何在存储过程中使用动态查询

php - FullCalendar 和 MySQL -- 优化我的查询

mysql - Laravel 中如何组合查询?

mysql - 如何只获取 mySQL 图上的传入边?