MySQL SELECT IF ID在其他表中

时间:2016-02-03 11:03:57

标签: mysql if-statement select

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

表"服务器"

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

表"保修":

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

servers.iD = warranty.linkID

现在我希望获得一个列表:

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

表示我需要表格中所有服务器的列表"服务器",以及Infofield"保修" (YES / NO)。

如果服务器的ID出现在表"保修"中,则应打印"是",否则:" no",但仅限于linkType = 2

我知道如何使用SELECT IF(服务器=" Y","是","不")AS"服务器?&# 34; ...查询,但我不知道如何在另一个表中存在或不存在ID。

8 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您希望在此处使用左外连接。如果保修将为空或1,则显示否则是。

答案 2 :(得分:0)

SELECT * , 
     if(exists (select * from warranty t1 where t.ID=t1.linkID and linkType=2), 'yes', "no") 
  FROM servers t1

答案 3 :(得分:0)

您必须执行ALTER TABLE Servers ADD Warranty type_donnees并执行

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

它的想法,测试它。

答案 4 :(得分:0)

尝试这样:

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

答案 5 :(得分:0)

首先,我希望您收集有关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

你会得到以下结果:

enter image description here

然后从这个结果集中,如果你在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

最终结果如下:

enter image description here

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

答案 6 :(得分:0)

使用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;

答案 7 :(得分:0)

我很想在yes / no字段中使用布尔值1/0,并将其转换为应用程序层中的文本。

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

这使得查询更简单:

var $matches = $('#mydiv').find('.adiv');

将来我也会更符合您的表名。 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是单数。我建议选择一个约定,我们在公司使用单数表名称。