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

mysql查询连接/子查询/联合,mysql,Mysql,假设我的MySQL数据库中有两个表——“Table1”和“Table2”。 “表1”中的“id”主键(自动增量)是“表2”-“选项卡id”中的参考键 一个“Table1”行可能有零个或多个“Table2”行 现在我正在尝试搜索“Table2”中的一列,比如“email”列,或者搜索“Table1”中的一列,比如“address”,并打印“Table1”行值 我认为有3种可能性: 1.参加 2.子查询 3.联合 1加入 SELECT * FROM Table1 t1, Table t2 WHE

假设我的MySQL数据库中有两个表——“Table1”和“Table2”。 “表1”中的“id”主键(自动增量)是“表2”-“选项卡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%');
--这很好,但是当“表2”中没有与“表1”相关的行时。。联接将失败,因此输出是一致的

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)中有两行manys时,查询速度非常慢:(

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
--这工作很好,可以创建一个具有类似联合的视图,完成此工作

现在,我的问题是,什么是正确的方式…总是给工会打电话可以吗

MySQL引擎:MyISAM

SELECT * 
FROM Table1 t1
   LEFT JOIN Table2 t2
      ON t1.id = t2.tab_id
WHERE t1.address like '%str%' OR t2.email like '%str%';
  • 您需要执行
    左联接
    。当您从两个表中执行
    时,它将作为
    内部联接
    (如果没有WHERE子句,则为交叉联接),这意味着输出仅显示两个表中匹配的行。使用
    左联接
    时,您说希望左表(t1)中的所有行与右表(t2)中匹配的行一致。如果t2中没有匹配,则使用
    null

  • 您可以使用子查询,但正如您所见,它不是最佳选择

  • 这里的
    联合
    没有任何优势。联合
    对于合并具有相同列的数据集非常有用

  • 编辑

    如果您在连接方面有问题,因为某些Table1行没有出现,那么您需要左连接。这需要很长时间,这是另一个问题。这些表一点都不大,所以我想您需要对这些表进行一些索引工作

    如果您需要有关联合的帮助,您需要告诉我哪些是相关的列,因为它们必须具有相同的列数、相同的类型和相同的顺序。 您可以在不使用联接的情况下优化
    联合
    ,这取决于当
    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%';
    
  • 您需要执行
    左联接
    。当您从两个表中执行
    时,它将作为
    内部联接
    (如果没有WHERE子句,则为交叉联接),这意味着输出仅显示两个表中匹配的行。使用
    左联接
    时,您说希望左表(t1)中的所有行与右表(t2)中匹配的行一致。如果t2中没有匹配,则使用
    null

  • 您可以使用子查询,但正如您所见,它不是最佳选择

  • 这里的
    联合
    没有任何优势。联合
    对于合并具有相同列的数据集非常有用

  • 编辑

    如果您在连接方面有问题,因为某些Table1行没有出现,那么您需要左连接。这需要很长时间,这是另一个问题。这些表一点都不大,所以我想您需要对这些表进行一些索引工作

    如果您需要有关联合的帮助,您需要告诉我哪些是相关的列,因为它们必须具有相同的列数、相同的类型和相同的顺序。 您可以在不使用联接的情况下优化
    联合
    ,这取决于当
    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%';
    

    我不知道你想做什么,但这听起来像是一个外部加入的工作,而不是一个工会。也许调查一下?我不知道你想做什么,但听起来像是一个外部加入的工作,而不是一个工会。也许调查一下吧?谢谢你的回答。但是,当合作时,左加入大约需要13秒与需要0.13秒的简单连接(如我所写)相比,简单连接只在“Table2”有一个或多个引用时才起作用,UNION大约需要0.16秒。“Table1”有2600行,“Table2”有3000行左右的响应。但与简单连接(如我所写)相比,左连接大约需要13秒这需要0.13秒,同样的问题,简单连接只在“Table2”有一个或多个引用时有效,UNION大约需要0.16秒。“Table1”有2600行,“Table2”有3000行左右