gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:16:10 24 4
gpt4 key购买 nike

假设我的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com