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 在其他表中的主要内容,如果未能解决你的问题,请参考以下文章