结合MySQL查询帮助 - 2个表

时间:2016-02-07 04:21:20

标签: mysql

我有一张表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表中的所有匹配项,那将会很好。

3 个答案:

答案 0 :(得分:2)

在last_actie列上使用ORDER BY(降序),然后限制为只有1行,即可访问整个成员行。

sqlfiddle demo

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';