使用PHP从多个表中查询MySQL数据

时间:2013-06-13 16:26:52

标签: php mysql database

我正在研究一个用于监控体育运动的数据库。我有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)

我概述了所有受伤的情况,我只使用了伤害表和每次受伤的详细页面,我使用这两张表中的信息,这一切都正常。

现在我希望TREND在概述的主页面上显示,并且您可以理解我只想要最新的趋势(基于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;
");

提前感谢与我一起思考。

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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

答案 2 :(得分: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

An SQLfiddle to test with

编辑:快速(并且,我意识到并非完全容易理解)解释;第一个联接是一个完全正常的联接,以获得injuryinjury_list中的相应条目。然后我再次LEFT JOIN再次injury list 查看是否存在较新的条目。如果没有,左连接将保留il2中的所有字段为NULL(即,不存在),我们应该显示我们刚刚构建的行。如果存在较新的条目,il2中的字段将包含来自较新条目的数据,在这种情况下,不应显示该行。