MySQL SELECT IF ID 在其他表中

Posted

技术标签:

【中文标题】MySQL SELECT IF ID 在其他表中【英文标题】:MySQL SELECT IF ID in other table 【发布时间】: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 连接吗? 【参考方案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 JOINS 和CASE 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 条件将不起作用

以上是关于MySQL SELECT IF ID 在其他表中的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 其他表中的平均最新列

mysql----其他小技巧

NodeJS mySQL 显示旧数据集

PHP MYSQL SELECT 即使有些是空的

使用mySQL中另一个表中的select结果更新表中的字段

mysql数据库中不显示某表中的某列中的某数据一条数据不显示怎么操作?