【问题标题】:MySQL SELECT IF ID in other tableMySQL SELECT IF ID 在其他表中
【发布时间】:2016-05-12 13:03:49
【问题描述】:

我需要对数据库进行查询。

表“服务器”

+----------+----------+
| ID       | Name     |
+----------+----------+
| 1        | Server1  |
| 2        | Server2  |
| 3        | Server3  |
| 4        | Server4  |
+----------+----------+

表“保修”:

+----------+----------+----------+
| linkType | linkID   | Year     |
+----------+----------+----------+
| 1        | 1        | 2015     |
| 2        | 3        | 2016     |
| 2        | 4        | 2016     |
+----------+----------+----------+

servers.iD = 保修.linkID

现在我想得到一个类似的列表:

+----------+----------+----------+
| Warranty | ServerID | Name     |
+----------+----------+----------+
| no       | 1        | Server1  |
| no       | 2        | Server2  |
| yes      | 3        | Server3  |
| yes      | 4        | Server4  |
+----------+----------+----------|

意味着我需要表“服务器”中所有服务器的列表,以及信息字段“保修”(是/否)。

如果服务器的 ID 出现在“warranty”表中,它应该打印“yes”,否则:“no”,但仅当 linkType = 2 时

我知道如何使用 SELECT IF(server = "Y", "yes", "no") AS "server?"... 查询,但我不知道如何 SELECT IF 存在 ID或者不在另一个表中。

【问题讨论】:

  • 您有查询吗?
  • 你熟悉 MySQL 连接吗?

标签: mysql if-statement select


【解决方案1】:
SELECT * , 
     if(exists (select * from warranty t1 where t.ID=t1.linkID and linkType=2), 'yes', "no") 
  FROM servers t1

【讨论】:

    【解决方案2】:

    首先你需要申请加入,然后检查你的条件。

    【讨论】:

      【解决方案3】:

      您希望在此处使用左外连接。如果保修为 null 或 1,则显示 no else yes。

      【讨论】:

        【解决方案4】:

        你必须做ALTER TABLE Servers ADD Warranty type_donnees然后做

        update TABLE Servers set warranty = 'yes' where (
        select EXISTS(
           select linkid from warranty were servers.id = linkid
        ));
        

        这个想法,测试一下。

        【讨论】:

          【解决方案5】:

          使用CASE 表达式和JOIN

          查询

          SELECT 
            CASE WHEN t1.ID IN 
            (SELECT linkID from warranty WHERE linkType = 2) THEN 'yes' ELSE 'no' END AS Warranty,
            t1.ID, t1.Name
          FROM servers t1 
          LEFT JOIN warranty t2
          ON t1.ID = t2.linkID;
          

          【讨论】:

            【解决方案6】:

            首先我想让你收集一些关于MySQL JOINSCASE WHEN 表达式的知识。

            然后尝试自己制定查询。

            只有在你真的遇到困难时才寻求帮助。

            说明:

            如果您只是在这两个表(服务器(左表)和保修)之间进行左连接 那么查询将如下所示:

            查询 #1:

            SELECT 
            servers.ID,
            servers.Name,
            warranty.linkType,
            warranty.linkID,
            warranty.`year`
            FROM servers
            LEFT JOIN warranty
            ON warranty.linkID = servers.ID
            ORDER BY servers.ID ASC
            

            你会得到以下结果:

            然后从这个结果集中,如果你在 linkType 上应用一些 if else(即 CASE WHEN) 那么查询将如下所示:

            查询 #2:

            SELECT 
            CASE WHEN warranty.linkType = 2 THEN "yes" ELSE "no" END AS Warranty,
            servers.ID AS ServerID,
            servers.Name
            FROM servers
            LEFT JOIN warranty
            ON warranty.linkID = servers.ID
            ORDER BY servers.ID ASC
            

            最后的结果是这样的:

            N:B: query #2 是最终查询。

            【讨论】:

              【解决方案7】:

              我很想对是/否字段使用布尔值 1/0,并将其转换为应用层中的文本。

              我还将 linkType 置于 LEFT JOIN 条件中。

              这使得查询更简单:

                 SELECT w.linkID IS NOT NULL AS warranty
                        s.ID AS ServerID,
                        s.Name,
                   FROM servers s
              LEFT JOIN warranty w
                     ON w.linkID = s.ID
                    AND w.linkType = 2
               ORDER BY s.ID 
              

              将来我也会与您的表名更加一致。servers 是复数,warranty 是单数。我建议选择一个约定,我们在公司中使用单数表名。

              【讨论】:

                【解决方案8】:

                这样试试:

                SELECT (CASE
                            WHEN w.linkID IS NULL THEN 'No'
                            ELSE 'Yes'
                        END) AS Warranty,
                       s.ID as ServerID,
                       S.Name AS Name
                FROM servers AS S
                LEFT JOIN warranty AS W ON s.iD = W.linkID
                WHERE W.linkType = 2
                

                【讨论】:

                • 您缺少 linkType 条件
                • 它必须是 LEFT JOIN 的一部分,否则你已经有效地编写了一个 INNER JOIN 并且你的 NULL 条件将不起作用
                猜你喜欢
                • 2012-06-08
                • 1970-01-01
                • 1970-01-01
                • 2012-12-19
                • 1970-01-01
                • 2012-06-29
                • 1970-01-01
                • 1970-01-01
                • 2022-08-03
                相关资源
                最近更新 更多