使用PHP从多个表和多个条目查询MySQL数据


query MySQL data from multiple tables with multiple entries with PHP

我正在研究一个监测运动损伤的数据库。我有两个表,一个叫伤病,另一个叫伤病列表。

伤情如下:

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

编辑:一个快速的(我意识到不太容易理解)解释;第一个连接是一个完全正常的连接,以获得injuryinjury_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