首页 > 解决方案 > 如何选择没有空记录的数据?

问题描述

我有两张桌子,设备和流通。设备表列出了我所有可供用户借用的设备。流通表列出了所有已借用或当前借用的设备。当设备被签出时,它会将设备 ID 添加到循环表中。流通表在 return_date 列中有一个 NULL 值。当设备被退回时,它会将日期添加到 return_date 列。因此,设备 ID 可以位于多行中。但是,只有一行的设备 ID 在 return_date 中具有 NULL 值。

我想要做的是只找到它没有出来的设备ID,在任何行的return_date列中都没有NULL值。

目前,我似乎只能获取每个设备 ID,因为在某些时候设备坏了,并且 return_date 列中有一个 NOT NULL 值。

我觉得一些 UNION 或 JOIN 会对此有所帮助,但我是 MySQL 的新手,我似乎无法弄清楚这一点。

这是我正在谈论的一个例子。

 Equipment Table                 Circulation Table
+--------------+-------------+  +---------------+--------------+-------------+
| equipment_id | name        |  |circulation_id | equipment_id | return_date |
+--------------+-------------+  +---------------+--------------+-------------+
| 1            | Screwdriver |  | 1             | 4            | 2019-07-16  |
| 2            | Hammer      |  | 2             | 2            | 2019-07-23  |
| 3            | Wrench      |  | 3             | 4            | 2019-07-24  |
| 4            | Pry Bar     |  | 4             | 1            | NULL        |
+--------------+-------------+  | 5             | 4            | NULL        |
                                +---------------+--------------+-------------+

我希望从这个查询中得到的是设备 ID 2 和 3,但目前我只得到 4 和 2。我知道我似乎可以简单地输入“SELECT equipment_id WHERE return_date IS NOT NULL”,但设备表也有名称和这是我真正想要的名字。一旦获得正确的 ID,我已经知道如何显示名称。

这是我尝试过的查询,不知道从哪里开始。

SELECT DISTINCT e.equipment_id
FROM equipment AS e
LEFT JOIN circulation AS c
ON e.equipment_id = c.equipment_id
WHERE c.return_date IS NOT NULL;

标签: mysql

解决方案


不存在:

SELECT e.equipment_id, e.name
FROM equipment AS e
WHERE NOT EXISTS (
  SELECT 1 FROM circulation AS c
  WHERE e.equipment_id = c.equipment_id AND c.return_date IS NULL
)

或与表的连接,分组依据equipment_id和 HAVING 子句中的条件:

SELECT e.equipment_id
FROM equipment AS e LEFT JOIN circulation AS c
ON e.equipment_id = c.equipment_id
GROUP BY e.equipment_id
HAVING SUM(c.return_date IS NULL) = 0 OR MAX(c.equipment_id) IS NULL

推荐阅读