我正在研究一个用于监控体育运动的数据库。我有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;
");
提前感谢与我一起思考。
答案 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
编辑:快速(并且,我意识到并非完全容易理解)解释;第一个联接是一个完全正常的联接,以获得injury
和injury_list
中的相应条目。然后我再次LEFT JOIN
再次injury list
查看是否存在较新的条目。如果没有,左连接将保留il2
中的所有字段为NULL(即,不存在),我们应该显示我们刚刚构建的行。如果存在较新的条目,il2
中的字段将包含来自较新条目的数据,在这种情况下,不应显示该行。