mysql - 如何选择没有空记录的数据?
问题描述
我有两张桌子,设备和流通。设备表列出了我所有可供用户借用的设备。流通表列出了所有已借用或当前借用的设备。当设备被签出时,它会将设备 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;
解决方案
不存在:
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
推荐阅读
- android - FB Android SDK 面临性能问题
- drupal - 更多 PHP 文件被检测为病毒
- php - mailgun 将电子邮件发送到垃圾邮件以获取公司电子邮件 ID
- vue.js - 日期已反映在代码中,但未显示在数据库中
- c++ - 添加调试输出时循环结果不同(Heisenbug?)
- mysql - 事务句柄数据库设计
- javascript - 如何正确允许nodejs有机会在我的无限while循环中运行它的异步事件
- azure-devops - 用户反馈与 Azure DevOps (VSTS) 的集成
- c - Arduino String 的替换函数和自定义的字符数组替换函数
- python - 如何从 django oscar 仪表板上传文件或图像?