我有两个桌子,设备和流通台。设备表列出了可供用户借用的所有设备。循环表列出了已借用或当前已借用的所有设备。当设备是checked-out时,它将equipment_id添加到循环表中。循环表在return_date列中具有NULL值。退还设备后,会将日期添加到return_date列中。因此,equipment_id可以排成许多行。但是,只有一行在return_date中具有NULL值的equipment_id。

我想做的是只找到equipment_id不在其中的地方,在任何行的return_date列中都没有NULL值。

目前,我似乎只能得到每个equipment_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        |
                                +---------------+--------------+-------------+

我希望从该查询中得到的是equipment_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;
分析解答

使用NOT EXISTS:

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