我有两个桌子,设备和流通台。设备表列出了可供用户借用的所有设备。循环表列出了已借用或当前已借用的所有设备。当设备是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