试图在两个条目之间找到丢失的记录
Trying to find missing records between two entries
我想在一秒钟内找出两个条目之间遗漏的记录 table。我可以通过选择一个 ID 并向后工作(稍后举例)来做到这一点,但需要更动态的东西。
我的 'people' 名单:
id |name |
---|--------|
1 |Seth |
2 |Richard |
3 |Jacob |
4 |Kate |
并在另一个 table 中对应 'entries'。
id |peopleid |entry_date |
---|---------|--------------------|
1 |1 |2017-04-12 07:19:44 |
2 |2 |2017-04-12 10:01:44 |
3 |3 |2017-04-12 10:03:00 |
4 |4 |2017-04-12 10:04:00 |
6 |1 |2017-04-13 17:06:00 |
7 |2 |2017-04-13 17:07:00 |
8 |4 |2017-04-13 18:09:00 |
9 |1 |2017-04-13 20:01:00 |
10 |1 |2017-04-13 22:03:00 |
11 |1 |2017-04-14 23:21:00 |
Seth 在 2017-04-12 的第一个条目 07:19 和他在 2017-04-13 的第二个条目之间 17 我在 "people" table 中为每个人捕获了一条记录, 所以一切都很好。
但是,在 2017-04-13 17:06 和 2017-04-14 08:09 之间的 Seths 条目之间,我只有 Richard(2) 和 Kate(4) 的数据,所以需要它报告 Jacob 的 (3) 条目丢失。
在 Seth 最后一次滑动(ID 的 9、10 和 11)之间,没有其他人的数据被捕获,他们需要被报告。
到目前为止,我有这个用于 2017-04-13 17:06 和 2017-04-14 08:09 之间的 Seths 条目 - 为此我需要结束 date/record 并使用向后工作的 ID:
SELECT *
FROM people
WHERE id NOT IN (
SELECT peopleid FROM entries e
WHERE id >= (
SELECT id
FROM entries e
WHERE id < 9 AND peopleid = 1
ORDER BY id DESC
LIMIT 1
) AND id < 9
)
这给了我
id |name |
---|------|
3 |Jacob |
我希望结束 week/month 查询以按天分解丢失的条目。
试试这个并更改“?”使用您希望它检查的日期(即 2017-04-13)
SELECT p.* FROM people p
LEFT JOIN entries e on e.peopleid = p.id AND DATE(entry_date) = ?
WHERE e.peopleid IS NULL;
SELECT p.* FROM people p
LEFT JOIN entries e on e.peopleid = p.id AND DATE(entry_date) = '2017-04-13'
WHERE e.peopleid IS NULL;
尝试这样的事情。这个想法是首先创建一个交叉连接,将每个人与每个可能的日期连接起来,其中 select 只有那些在 entries
-table 中没有相应条目的行存在。希望它可以在不必更正许多语法问题的情况下工作:
select *
from people p join (select distinct date(entry_date) as day from entries) dates
where not exists
(select * from entries e
where p.id = e.people_id and dates.day = date(e.entry_date))
我想在一秒钟内找出两个条目之间遗漏的记录 table。我可以通过选择一个 ID 并向后工作(稍后举例)来做到这一点,但需要更动态的东西。
我的 'people' 名单:
id |name |
---|--------|
1 |Seth |
2 |Richard |
3 |Jacob |
4 |Kate |
并在另一个 table 中对应 'entries'。
id |peopleid |entry_date |
---|---------|--------------------|
1 |1 |2017-04-12 07:19:44 |
2 |2 |2017-04-12 10:01:44 |
3 |3 |2017-04-12 10:03:00 |
4 |4 |2017-04-12 10:04:00 |
6 |1 |2017-04-13 17:06:00 |
7 |2 |2017-04-13 17:07:00 |
8 |4 |2017-04-13 18:09:00 |
9 |1 |2017-04-13 20:01:00 |
10 |1 |2017-04-13 22:03:00 |
11 |1 |2017-04-14 23:21:00 |
Seth 在 2017-04-12 的第一个条目 07:19 和他在 2017-04-13 的第二个条目之间 17 我在 "people" table 中为每个人捕获了一条记录, 所以一切都很好。
但是,在 2017-04-13 17:06 和 2017-04-14 08:09 之间的 Seths 条目之间,我只有 Richard(2) 和 Kate(4) 的数据,所以需要它报告 Jacob 的 (3) 条目丢失。
在 Seth 最后一次滑动(ID 的 9、10 和 11)之间,没有其他人的数据被捕获,他们需要被报告。
到目前为止,我有这个用于 2017-04-13 17:06 和 2017-04-14 08:09 之间的 Seths 条目 - 为此我需要结束 date/record 并使用向后工作的 ID:
SELECT *
FROM people
WHERE id NOT IN (
SELECT peopleid FROM entries e
WHERE id >= (
SELECT id
FROM entries e
WHERE id < 9 AND peopleid = 1
ORDER BY id DESC
LIMIT 1
) AND id < 9
)
这给了我
id |name |
---|------|
3 |Jacob |
我希望结束 week/month 查询以按天分解丢失的条目。
试试这个并更改“?”使用您希望它检查的日期(即 2017-04-13)
SELECT p.* FROM people p
LEFT JOIN entries e on e.peopleid = p.id AND DATE(entry_date) = ?
WHERE e.peopleid IS NULL;
SELECT p.* FROM people p
LEFT JOIN entries e on e.peopleid = p.id AND DATE(entry_date) = '2017-04-13'
WHERE e.peopleid IS NULL;
尝试这样的事情。这个想法是首先创建一个交叉连接,将每个人与每个可能的日期连接起来,其中 select 只有那些在 entries
-table 中没有相应条目的行存在。希望它可以在不必更正许多语法问题的情况下工作:
select *
from people p join (select distinct date(entry_date) as day from entries) dates
where not exists
(select * from entries e
where p.id = e.people_id and dates.day = date(e.entry_date))