2013-08-26 179 views
1

我有一個人員表,一個單元表和一個健康表(如下所述)。基本上在我的工作中,我們必須檢查人員,如果他們還沒有被看到兩天,我們去尋找他們...我想要的是能夠選擇健康表中的所有記錄是兩天以上,但只有最新的(因爲可能會有多個條目每人每天,這是我想要它,因爲在wellness.username字段,你可以告訴誰看到了誰,什麼時候)。MySQL只選擇2天以前的最新記錄(時間戳)

People 
+------------+-------------+------+-----+-------------------+----------------+ 
| Field  | Type  | Null | Key | Default   | Extra   | 
+------------+-------------+------+-----+-------------------+----------------+ 
| id   | int(11)  | NO | PRI | NULL    | auto_increment | 
| fname  | varchar(32) | NO |  | NULL    |    | 
| lname  | varchar(32) | NO |  | NULL    |    | 
| dob  | date  | NO |  | 0000-00-00  |    | 
| license_no | varchar(24) | NO |  | NULL    |    | 
| date_added | timestamp | NO |  | CURRENT_TIMESTAMP |    | 
| status  | varchar(8) | NO |  | Allow    |    | 
+------------+-------------+------+-----+-------------------+----------------+ 

Units 
+----------+-------------+------+-----+---------+----------------+ 
| Field | Type  | Null | Key | Default | Extra   | 
+----------+-------------+------+-----+---------+----------------+ 
| id  | int(11)  | NO | PRI | NULL | auto_increment | 
| number | varchar(3) | NO |  | NULL |    | 
| resident | int(11)  | NO | MUL | NULL |    | 
| type  | varchar(16) | NO |  | NULL |    | 
+----------+-------------+------+-----+---------+----------------+ 

+--------------+-------------+------+-----+-------------------+----------------+ 
| Field  | Type  | Null | Key | Default   | Extra   | 
+--------------+-------------+------+-----+-------------------+----------------+ 
| wellness_id | int(11)  | NO | PRI | NULL    | auto_increment | 
| people_id | int(11)  | NO |  | NULL    |    | 
| time_checked | timestamp | NO |  | CURRENT_TIMESTAMP |    | 
| check_type | varchar(1) | NO |  | NULL    |    | 
| username  | varchar(16) | NO |  | jmd9qs   |    | 
+--------------+-------------+------+-----+-------------------+----------------+ 

units表是醜陋的,我知道,但它很快就會改變;因爲它,resident引用people.id

這裏是我的最低工作實例,只給了我,即使有多個peoplewellness有超過2天的一個time_checked行的一個結果。的一個結果我得到更像是4-1/2日齡....

select w.wellness_id, p.id, p.lname, p.fname, u.number, u.type, 
w.time_checked, w.check_type, w.username 
from people p 
    left join units u on p.id = u.resident 
    right join wellness w on p.id = w.people_id 
    WHERE w.time_checked <= DATE_ADD(CURDATE(), INTERVAL -2 DAY) 
order by w.time_checked asc; 

我試圖讓那些超過兩天的最新的記錄,但只有每people是1在wellness表中。我加入了其他所有內容,因爲我需要它來顯示使用PHP的記錄。

對不起,我的問題相當混亂,希望已經夠清楚了!

編輯 - 樣本數據:

+------+------+--------+---------------------+------------+----------+ 
| w_id | id | number | time_checked  | check_type | username | 
+------+------+--------+---------------------+------------+----------+ 
| 100 | 2 | 425 | 2013-08-23 21:03:00 | s   | jmd9qs | 
| 101 | 2 | 425 | 2013-08-25 05:41:01 | s   | jmd9qs | 
| 91 | 2 | 425 | 2013-08-20 19:52:23 | s   | jmd9qs | 
| 83 | 4 | 416 | 2013-08-23 20:12:29 | s   | jmd9qs | 
| 76 | 5 | 408 | 2013-08-23 20:11:21 | s   | jmd9qs | 
| 62 | 6 | 327 | 2013-08-23 20:06:13 | s   | jmd9qs | 
| 18 | 7 | 204 | 2013-08-23 19:43:58 | s   | jmd9qs | 
| 31 | 8 | 219 | 2013-08-23 19:51:11 | s   | jmd9qs | 
| 97 | 9 | 432 | 2013-08-23 20:16:39 | o   | jmd9qs | 
| 44 | 10 | 309 | 2013-08-23 19:55:45 | s   | jmd9qs | 
+------+------+--------+---------------------+------------+----------+ 
+0

你能提供的樣本數據,並在此基礎上所需的輸出? – peterm

+0

我無法真正向您展示示例數據,因爲它的性質,但我真正需要返回的是people.id,people.fname,people.lname和unit.number匹配我的標準是a)沒有被看到2天,b)每個人只有一個結果 – jmd9qs

+0

它可能是假的數據,沒有人對真正的數據感興趣。但需要更好地理解您的要求,其次要測試查詢。否則,我們需要花時間和自己來彌補。 – peterm

回答

2

恕我直言RIGHT JOINpeoplewellness是沒有意義的,因爲不應該有當的情況你在wellness有一個人,但在people表中沒有該人。但反之亦然。你有一個新的人,但沒有任何關於他或她的健康信息。

話雖這麼說,您的查詢可能是這樣

SELECT z.wellness_id, p.id, z.time_checked, z.check_type, z.username 
    FROM people p JOIN units u 
    ON p.id = u.resident LEFT JOIN 
(
    SELECT w.* 
    FROM 
    (
    SELECT people_id, MAX(time_checked) time_checked 
     FROM wellness 
    GROUP BY people_id 
) q JOIN wellness w 
     ON q.people_id = w.people_id 
    AND q.time_checked = w.time_checked 
) z 
    ON p.id = z.people_id 
WHERE COALESCE(time_checked, 0) < CURDATE() - INTERVAL 2 DAY 

這裏是SQLFiddle演示

+0

說實話,我並不是100%的加入,我只是知道我在使用它,因爲它沒有向我拋出任何'NULL'值。但是,您的查詢確實存在,但我無法告訴您爲什麼 – jmd9qs

+0

我不知道它是否重要,但我用'left join'取代了'right join',結果保持不變。 – jmd9qs

+0

@ jmd9qs sqlfiddle示例,我提供了一種情況,當您在人員表中有人時,但沒有健康檢查有關他/她的信息(至少尚未)。現在根據您的要求和常識,這些記錄應該放在結果集中,因爲沒有人檢查過這些人。在我的例子中,那些id爲1和3的人。如果將左連接更改爲內連接,則不會看到這些記錄。 – peterm

0

這裏的查詢得到我想要什麼:

select p.id, u.number, 
    w.time_checked, w.check_type, w.username 
    from people p inner join units u on p.id = u.resident 
    left join wellness w on p.id = w.people_id 
    left outer join wellness as w2 ON w.people_id = w2.people_id 
    and w.time_checked < w2.time_checked 
    where w2.people_id is null and w.time_checked < (NOW() - INTERVAL 2 DAY) 
order by w.time_checked asc 
+0

感謝@Stephen O'Flynn! – jmd9qs