我正在研究一个监测运动损伤的数据库。我有两个表,一个叫伤病,另一个叫伤病列表。
伤情如下:
-----------------------------------------------------------------------
injury_id | name | body_part | first_mention | last_changed | status
-----------------------------------------------------------------------
| 2 | Ben | arm | 2013-06-08 | 2013-06-13 | 0 |
| 3 | Rick | knee | 2013-05-10 | 2013-06-12 | 0 |
| 4 | Esther| ankle | 2013-05-26 | 2013-06-12 | 1 |
-----------------------------------------------------------------------
然后是伤病列表,我用它来存储来自物理治疗师和教练的更新
-----------------------------------------------------------------------
list_id | injury_id | Comments | trend | comment_added
-----------------------------------------------------------------------
| 1 | 2 | Complains a lot wo.... | 1 | 2013-06-01 |
| 2 | 2 | Gets a little bit be.. | 3 | 2013-06-08 |
| 3 | 2 | no changes so far..... | 2 | 2013-06-13 |
| 4 | 4 | aches a lot, send t... | 1 | 2013-06-01 |
| 5 | 4 | Got a lot worse ne.... | 1 | 2013-06-08 |
| 6 | 4 | no changes so far..... | 2 | 2013-06-13 |
-----------------------------------------------------------------------
趋势用于显示损伤加重(1)、好转(2)或无变化(3)
我有一个关于所有伤病的概述,我只使用伤病表和每个伤病的详细页面,我使用两个表中的信息,这一切都很好。
现在我想在概述的主页上显示趋势,正如你所理解的,我只想要最新的趋势(基于comment_added)。我尝试了几个查询,但我似乎不明白如何正确地调用数据。
我不太擅长连接,我实际上不知道这是否是这里的解决方案,我希望有人能帮助我:
$result = mysqli_query($con,"
SELECT b.injury_id
, bl.injury_id b.name
, b.body_part
, b.first_mention
, b.last_changed
, b.status
FROM injury b
JOIN injury_list bl
ON bl.injury_id = b.injury_id
ORDER
BY status ASC
, last_changed DESC;
");
提前感谢你的思考
这是另一个方法…
SELECT i.*
, x.*
FROM injury i
JOIN injury_list x
ON x.injury_id = i.injury_id
JOIN
( SELECT injury_id
, MAX(list_id) max_list_id
FROM injury_list
GROUP
BY injury_id
) y
ON y.injury_id = x.injury_id
AND y.max_list_id = x.list_id;
…这里是第三种方法,一个简单的LEFT JOIN
来查找最近的行以消除子查询;
SELECT i.*,il1.*
FROM injury i
JOIN injury_list il1
ON i.injury_id = il1.injury_id
LEFT JOIN injury_list il2
ON i.injury_id = il2.injury_id
AND il1.comment_added < il2.comment_added
WHERE il2.injury_id IS NULL
用于测试的SQLfiddle。
编辑:一个快速的(我意识到不太容易理解)解释;第一个连接是一个完全正常的连接,以获得injury
和injury_list
中相应的条目。然后再次将LEFT JOIN
转到injury list
以查看是否存在较新的条目。如果没有,左连接将在il2
中留下所有字段NULL(即不存在),我们应该显示我们刚刚构建的行。如果存在新条目,则il2
中的字段将具有来自新条目的数据,在这种情况下,不应显示该行。
您可以通过匹配子查询来实现这一点,该子查询为每个injury_id
获取最新的comment_added
。
SELECT
b.injury_id, bl.injury_id b.name, b.body_part,
b.first_mention, b.last_changed, b.status
FROM injury b
INNER JOIN injury_list bl ON b.injury_id = bl.injury_id
WHERE (bl.injury_id, bl.comment_added) IN (
SELECT injury_id, MAX(comment_added)
FROM injury_list
GROUP BY injury_id)
ORDER BY status, last_changed DESC