我有一个人员表,一个单位表和一个健康表(如下所述)。基本上,在我的工作中,我们必须检查一下人,如果两天都没有看到他们,我们会去找他们...我想要的是能够从健康表中选择所有记录,超过两天,但只有最新的(因为每人每天可能会有多个条目,这是我想要的方式,因为在该wellness.username
字段中,您可以告诉谁看到了谁,何时看到了)。
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
。
这里是我的最低工作实例,只给了我,即使有多个一个结果people
中wellness
有一个time_checked
行超过2天以上。我得到的一个结果更像是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;
我试图让那些超过两天的最新的记录,但只有1%people
是在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 |
+------+------+--------+---------------------+------------+----------+
恕我直言,RIGHT JOIN
从people
到wellness
没有意义,因为当您有一个人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演示
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句