2016-02-07 64 views
0

我有一個表rosters和一個表members。他們建立這樣的:組合MySQL查詢幫助 - 2個表

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,其中團隊= 1來獲取所有行。然後,我需要所有這些返回的結果,並使用member列從members獲取最大last_active值,其中id是從rosters

返回的結果該名單這是我會怎麼做它在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

我想我可能理解你的要求,但你的樣本'members'表沒有多於一個'last_active'值(或多於一行),因此不清楚爲什麼你需要最大的'last_active'。你能否更新'members'樣本,以便它更具代表性,並且還提供了你期望的輸出結果的表格? –

+0

此外,您是否真的需要使用輸出中'rosters'表中的其他列值?你的示例PHP使用'SELECT *',但如果你實際上不需要這些列,它會簡化查詢。 –

+0

我已更新了不同時間的成員表。不,我不需要輸出任何值,而我用於比較的唯一值是members表中的last_active列。 – SISYN

回答

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

我有點困惑,你爲什麼要從members中檢索行,其中id值與rostersteam值相匹配。似乎你想在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 MAX(m.last_active) AS last_active 
    FROM members m 
    JOIN rosters r 
    ON r.team = m.id 
WHERE r.team = 1 

MAX()聚合函數在SELECT列表中,沒有GROUP BY條款,導致將所有行中的所有行都「摺疊」成單行。將返回滿足謂詞的行的最大值last_active

你可以看到如何連接操作通過消除MAX()總工程...

SELECT m.last_active 
    , m.id   AS member_id 
    , m.name   AS member_name 
    , r.member 
    , r.team 
    , r.id AS roster_id 
    FROM members m 
    JOIN rosters r 
    ON r.member = m.id 
WHERE r.team = 1 
ORDER BY m.last_active DESC 
+0

是的,我想將id與從名單表返回的數據的成員值匹配。我認爲你的回答是正確的,並適合我的需求。謝謝。 – SISYN

2

通過使用ORDER BY上last_actie列(降序),則限制到只有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 |