【问题标题】:How To Join in MySQL Query如何加入 MySQL 查询
【发布时间】:2012-10-21 03:28:54
【问题描述】:

我有 2 个表要加入。

Table 1 是一个主表,包含一组唯一的行。

ID DESCRIPTION
01 Alpha
02 Gamma
03 Delta
04 Beta

Table 2 是一个包含许多行的明细表,其中只有一些行与主表匹配。

ID   INFO MASTER_ID
0001 abc  02
0002 def  02
0004 xyz  01
0005 mno  04

我想加入表格以产生以下结果:

Alpha "has detail"
Gamma "has detail"
Delta "does not have detail"
Beta "has detail"

而不是:

Alpha "has detail"
Gamma "has detail"
Gamma "has detail"
Delta "does not have detail"
Beta "has detail"

后面的输出返回 Gamma 两次,我只希望它返回一次。

我尝试了 LEFT JOIN、RIGHT JOIN、INNER JOIN,但都没有产生我想要的结果。

感谢您的帮助。

【问题讨论】:

    标签: mysql join


    【解决方案1】:

    使用LEFT JOIN 可能你错过了什么

    SELECT  CONCAT(a. description, IF(b.master_ID IS NOT NULL, ' has detail',' does not have detail'))
    FROM    table1 a
            LEFT JOIN (SELECT DISTINCT master_ID FROM table2) b
                ON a.ID = b.master_ID
    

    【讨论】:

      【解决方案2】:

      可能是这样的:

      SELECT
          Table1.DESCRIPTION,
          (
              CASE 
                  WHEN EXISTS(SELECT NULL FROM Table2 WHERE Table2.MASTER_ID=Table1.ID)
                  THEN 'has detail'
                  ELSE 'does not have detail'
              END
          ) AS has
      FROM
          Table1
      

      【讨论】:

      • 我相信您的解决方案会起作用@Arion,但我没有尝试过。我先看到John Woo的回答,试了一下。我将它嵌入到我的代码中并且它有效。所以我更愿意继续使用该解决方案。感谢您提供帮助。
      【解决方案3】:

      只是一种不同的方法:

      SELECT
        table1.description,
        IF((EXISTS(SELECT master_id from table2  where table2.master_id = table1.id)),
          'has detail',
          'does not have detail') As Status
      FROM table1
      

      【讨论】:

      • 我很好奇你的解决方案@fthiella。如果您不使用 JOIN 而是使用查询语句,您是否没有为表 1 中处理的每一行读取表 2 - 因此处理效率可能会降低一些?
      • 联接通常比子查询快,但并非总是如此。在这种情况下,我不能确定,但​​我猜这个解决方案可能比其他解决方案效率低。但它非常易于阅读,您立即知道它在做什么!
      • 同意@fthiella——由于查询的精简和浓缩编码,它引起了我的注意。我只是在想它可能不是最有效的,因为表 2 是如何针对表 1 进行处理的。尽管如此,正如我在您发布之前所说的那样,我找到并实施了一个解决方案,可以满足我的需求,所以我继续前进。感谢您的贡献。
      【解决方案4】:
      SELECT a.Description, IF(b.Info, "has detail", "does not have detail") as Status
      FROM Table_1 a
      LEFT OUTER JOIN Table_2 b
      ON a.MASTER_ID = b.MASTER_ID
      GROUP BY 1,2;
      

      【讨论】:

        【解决方案5】:

        如果您的输出包含详细信息部分,那么您必须查看两行(因为它是有效结果),或者您需要通过选择 FIRST、MAX 等来聚合结果。

        如果您自己不需要详细信息值,那么替代方法是执行两个 SELECT 并使用 UNION:

            SELECT DISTINCT Table1.Description, "does not have detail" as Comment
            FROM Table1
            LEFT JOIN Table2 ON (Table1.ID = MASTER_ID)
            WHERE Table2.id IS NULL
        
            UNION 
        
            SELECT DISTINCT Table1.Description, "has detail" as Comment
            FROM Table1
            LEFT JOIN Table2 ON (Table1.ID = MASTER_ID)
            WHERE Table2.id IS NOT NULL
        

        【讨论】:

          【解决方案6】:

          您也可以使用 groupby 实现此目的

          SELECT a.Description, IF(count(b.id) > 0, "has detail", "does not have detail") as Status
          FROM Table1 a
          LEFT OUTER JOIN Table2 b
          ON a.iD = b.MASTER_ID
          GROUP BY a.Description ORDER BY a.Description ASC
          

          【讨论】:

            猜你喜欢
            • 2018-05-09
            • 1970-01-01
            • 2015-07-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-20
            • 2011-12-23
            相关资源
            最近更新 更多