0

我正在研究用于监测运动损伤的数据库。我有 2 张表,一张称为伤害,另一张称为伤害列表。

伤害是这样的:

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

我有一个关于所有伤害的概述,我只使用 INJURY 表和每个伤害的详细页面,我使用两个表中的信息,这一切都很好。

现在我希望趋势显示在概述的主页上,并且您可以理解我只想要最新趋势(基于comment_add)。我尝试了几个查询,但我似乎无法理解如何正确调用数据。

我不太擅长加入,实际上我不知道这是否是这里的解决方案,我希望有人可以帮助我:

$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;
");

提前感谢您与我一起思考。

4

3 回答 3

1

这是另一种方法...

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;
于 2013-06-13T17:21:01.620 回答
0

您可以通过匹配获取comment_added每个最新的子查询来做到这一点injury_id

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
于 2013-06-13T16:32:53.363 回答
0

...这是第三种方法,一种简单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是否存在较新的条目。如果不是,左连接将使所有字段为NULL(即不存在),我们应该显示我们刚刚构建的行。如果存在较新的条目,则其中的字段将具有来自较新条目的数据,在这种情况下,不应显示该行。injury listil2il2

于 2013-06-13T17:35:26.047 回答