我有一张表rosters
和一张表members
。它们的设置如下:
rosters table
id team member
1 1 1
2 1 2
3 1 3
members table
id name last_active
1 Dan 1454815000
2 Ewan 1454817500
3 Cate 1454818369
我需要获取rosters
中team = 1的所有行。然后,我需要获取所有返回的结果并使用member
列从last_active
中获取最大members
值,其中id
位于rosters
返回的结果列表中{1}}
这是我在PHP中的方式,但我确信有一种方法可以使用更有效的查询。
$rosterList = $db->query('SELECT * FROM rosters WHERE team=1');
$lastActive = 0;
foreach($rosterList as $roster) {
$activity = $db->query('SELECT last_active FROM members WHERE id='.$roster['team']);
if ( $activity > $lastActive )
$lastActive = $activity;
}
if ( $lastActive > time()-60 )
echo 'team is currently online';
如果它只能返回一个带有最新last_active
列的结果,但是如果它返回members
表中的所有匹配项,那将会很好。
答案 0 :(得分:2)
在last_actie列上使用ORDER BY
(降序),然后限制为只有1行,即可访问整个成员行。
MySQL 5.6架构设置:
CREATE TABLE members
(`id` int, `name` varchar(4), `last_active` int)
;
INSERT INTO members
(`id`, `name`, `last_active`)
VALUES
(1, 'Dan', 1454815000),
(2, 'Ewan', 1454817500),
(3, 'Cate', 1454818369)
;
CREATE TABLE rosters
(`id` int, `team` int, `member` int)
;
INSERT INTO rosters
(`id`, `team`, `member`)
VALUES
(1, 1, 1),
(2, 1, 2),
(3, 1, 3)
;
查询1 :
select
m.*
from members m
join rosters r on m.id = r.member
where r.team = 1
order by m.last_active DESC
limit 1
<强> Results 强>:
| id | name | last_active |
|----|------|-------------|
| 3 | Cate | 1454818369 |
答案 1 :(得分:1)
我有点困惑为什么要从members
检索id
值与team
的{{1}}值匹配的行。好像您希望在rosters
列上匹配。
您可以使用 join 操作和聚合函数。要为给定member
的所有成员获取last_active
的最大值,请使用team
列,如下所示:
member
使用 SELECT MAX(m.last_active) AS last_active
FROM members m
JOIN rosters r
ON r.member = m.id
WHERE r.team = 1
列执行与原始示例相同的操作(再次,我不明白为什么要执行此操作,因为它看起来不正确):
team
SELECT列表中的SELECT MAX(m.last_active) AS last_active
FROM members m
JOIN rosters r
ON r.team = m.id
WHERE r.team = 1
聚合函数没有MAX()
子句,导致返回的所有行都“折叠”为一行。将返回满足谓词的行中GROUP BY
的最大值。
您可以通过消除last_active
聚合...
MAX()
答案 2 :(得分:1)
您可以使用以下解决方案:
$result_array = mysql_query("SELECT * FROM rosters as r INNER JOIN members as m on r.member=m.id AND r.team = '1' ORDER BY last_active DESC LIMIT 1");
$lastActive = 0;
if($result_array)
{
while($row = mysql_fetch_row($result_array,MYSQL_ASSOC))
{
$lastActive = $result_array['last_active'];
}
}
if ( !empty($lastActive) && $lastActive > time()-60 )
echo 'team is currently online';