MySQL - 将查询结果与当前 table 数据进行比较
MySQL - Compare query results to current table data
我有以下两个表:
表 1
| id | name | job | start_time | end_time |
| ----| ------| --------| ---------------------| ----------------------|
| 111 | John | Janitor| 2016-08-20 00:01:00 | NULL |
| 111 | John | Janitor| NULL | 2016-08-20 00:02:00 |
| 222 | Sam | Valet | 2016-08-20 00:03:00 | NULL |
| 222 | Sam | Valet | NULL | 2016-08-20 00:04:00 |
表 2
| name | job | checkin_time |
| ------| --------| ---------------------|
| John | Janitor| 2016-08-20 00:01:30 |
| Sam | Valet | 2016-08-20 00:03:30 |
| Tim | Cashier| 2016-09-20 00:01:00 |
下面查询
SELECT id, Table2.name, Table2.job, start_time, Table2.checkin_time, end_time FROM (
SELECT id,name,job, MIN(start_time) AS start_time, MAX(end_time) AS end_time
FROM Table1
GROUP BY id
) AS results INNER JOIN Table2 ON
results.job = Table2.job
AND results.name = Table2.name
AND (Table2.checkin_time BETWEEN results.start_time AND results.end_time OR
Table2.checkin_time >= results.start_time AND results.end_time IS NULL);
将显示:
| id | name | job | start_time | checkin_time | end_time |
| ----| ------| --------| ---------------------| --------------------|----------------|
| 111 | John | Janitor| 2016-08-20 00:01:00 | 2016-08-20 00:01:30 |2016-08-20 00:02:00 |
| 222 | Sam | Valet | 2016-08-20 00:03:00 | 2016-08-20 00:03:30 |2016-08-20 00:04:00 |
我如何制定我的查询,以便它 return 不是 successful/found 的记录。例如。从表 1 中,记录为:
| Tim | Cashier| 2016-09-20 00:01:00 |
提前感谢您对社区团队的帮助!
您可以进行右连接并使用空值仅过滤 "no matches":
SELECT table2.*
FROM (
SELECT id,name,job, MIN(start_time) AS start_time, MAX(end_time) AS end_time
FROM Table1
GROUP BY id) AS results
RIGHT JOIN Table2 ON
results.job = Table2.job
AND results.name = Table2.name
AND (Table2.checkin_time BETWEEN results.start_time AND results.end_time OR
Table2.checkin_time >= results.start_time AND results.end_time IS NULL)
WHERE results.id IS NULL
您可以使用 NOT-EXISTS 子句来执行任务:在这里您可以在 table2 中找到不在您的选择结果中的行。
SELECT
name, job, checkin_time
FROM
table2
WHERE NOT EXIST (
SELECT *
FROM
v
WHERE
v.name = table2.name)
合并在一起:
Create View v AS
(SELECT id, Table2.name, Table2.job, start_time, Table2.checkin_time, end_time FROM (
SELECT id,name,job, MIN(start_time) AS start_time, MAX(end_time) AS end_time
FROM Table1
GROUP BY id
) AS results INNER JOIN Table2 ON
results.job = Table2.job
AND results.name = Table2.name
AND (Table2.checkin_time BETWEEN results.start_time AND results.end_time OR
Table2.checkin_time >= results.start_time AND results.end_time IS NULL));
SELECT
name, job, checkin_time
FROM
table2
WHERE NOT EXIST (
SELECT *
FROM
v
WHERE
v.name = table2.name)
我有以下两个表:
表 1
| id | name | job | start_time | end_time |
| ----| ------| --------| ---------------------| ----------------------|
| 111 | John | Janitor| 2016-08-20 00:01:00 | NULL |
| 111 | John | Janitor| NULL | 2016-08-20 00:02:00 |
| 222 | Sam | Valet | 2016-08-20 00:03:00 | NULL |
| 222 | Sam | Valet | NULL | 2016-08-20 00:04:00 |
表 2
| name | job | checkin_time |
| ------| --------| ---------------------|
| John | Janitor| 2016-08-20 00:01:30 |
| Sam | Valet | 2016-08-20 00:03:30 |
| Tim | Cashier| 2016-09-20 00:01:00 |
下面查询
SELECT id, Table2.name, Table2.job, start_time, Table2.checkin_time, end_time FROM (
SELECT id,name,job, MIN(start_time) AS start_time, MAX(end_time) AS end_time
FROM Table1
GROUP BY id
) AS results INNER JOIN Table2 ON
results.job = Table2.job
AND results.name = Table2.name
AND (Table2.checkin_time BETWEEN results.start_time AND results.end_time OR
Table2.checkin_time >= results.start_time AND results.end_time IS NULL);
将显示:
| id | name | job | start_time | checkin_time | end_time |
| ----| ------| --------| ---------------------| --------------------|----------------|
| 111 | John | Janitor| 2016-08-20 00:01:00 | 2016-08-20 00:01:30 |2016-08-20 00:02:00 |
| 222 | Sam | Valet | 2016-08-20 00:03:00 | 2016-08-20 00:03:30 |2016-08-20 00:04:00 |
我如何制定我的查询,以便它 return 不是 successful/found 的记录。例如。从表 1 中,记录为:
| Tim | Cashier| 2016-09-20 00:01:00 |
提前感谢您对社区团队的帮助!
您可以进行右连接并使用空值仅过滤 "no matches":
SELECT table2.*
FROM (
SELECT id,name,job, MIN(start_time) AS start_time, MAX(end_time) AS end_time
FROM Table1
GROUP BY id) AS results
RIGHT JOIN Table2 ON
results.job = Table2.job
AND results.name = Table2.name
AND (Table2.checkin_time BETWEEN results.start_time AND results.end_time OR
Table2.checkin_time >= results.start_time AND results.end_time IS NULL)
WHERE results.id IS NULL
您可以使用 NOT-EXISTS 子句来执行任务:在这里您可以在 table2 中找到不在您的选择结果中的行。
SELECT
name, job, checkin_time
FROM
table2
WHERE NOT EXIST (
SELECT *
FROM
v
WHERE
v.name = table2.name)
合并在一起:
Create View v AS
(SELECT id, Table2.name, Table2.job, start_time, Table2.checkin_time, end_time FROM (
SELECT id,name,job, MIN(start_time) AS start_time, MAX(end_time) AS end_time
FROM Table1
GROUP BY id
) AS results INNER JOIN Table2 ON
results.job = Table2.job
AND results.name = Table2.name
AND (Table2.checkin_time BETWEEN results.start_time AND results.end_time OR
Table2.checkin_time >= results.start_time AND results.end_time IS NULL));
SELECT
name, job, checkin_time
FROM
table2
WHERE NOT EXIST (
SELECT *
FROM
v
WHERE
v.name = table2.name)