2016-09-15 54 views
0

我有以下兩個表:MySQL的 - 比較查詢結果與當前的表數據

表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 | 

如何制定我的查詢,以便它將返回未成功/找到的記錄。例如。從表1,記錄:

| Tim | Cashier| 2016-09-20 00:01:00 | 

感謝您的幫助社區團隊!

+0

修正...它應該是參考表2,表1不是。例如。我如何制定我的查詢,以便它將返回不成功/找到的記錄。例如。從表2可以看出: | Tim |出納| 2016-09-20 00:01:00 | – user3567212

+1

您可以使用評論中提到的更改編輯您的問題。 – suku

回答

0

你可以做一個正確的加入,僅過濾「不匹配」使用空值:

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 
+0

請注意,RIGHT JOINs非常罕見。這可能是我今年看到的第一個。 – Strawberry

0

您可以使用NOT-EXISTS子句來執行任務:在這裏你會發現在表2中不排在您的選擇結果。

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)