2011-10-22 41 views
0

我在簡單機器論壇網絡論壇軟件中引用了兩個表:smf_members和smf_members。 smf_members中的每一行都有一個字段:id_group,其中我對值感興趣:1,9,20,26,23,27(使用IN()子句)。總體目標是確定smf_members表中哪些行上述組ID在90天內沒有在smf_messages中輸入的行。 smf_messages中的poster_time是一個unix時間戳。我至今是:彙總加入結果,我也在MySQL中使用where子句

SELECT 
    m.id_member, 
    m.id_group, 
    from_unixtime(max(ms.poster_time)) 
FROM 
    smf_members m 
    LEFT JOIN smf_messages ms 
    USING(id_member) 
WHERE 
    max(ms.poster_time) < (NOW() < (86400 * 90) 
GROUP BY 
    m.id_member 

它失敗和錯誤1111:無效使用組功能的,因爲我在where子句中使用MAX()。我如何彙總我的連接結果以僅引用基於poster_time字段的最新條目?

+0

這是應該減去而不是「<」? – dkretz

+0

MySQL不支持'HAVING'子句或什麼? –

回答

0

這有幾種方法。

  1. SELECT * FROM成員 WHERE id_member IN(...) AND NOT EXISTS (SELECT 1 FROM消息 WHERE IS_MEMBER = members.id_member AND poster_time>(UNIX_TIMESTAMP *() - 90 * 24 * 60 * 60)

  2. 找地方外連接的情況下,覺得沒有什麼 SELECT DISTINCT id_member 議員爲M ... LEFT JOIN消息味精使用.... WHERE msg.id IS NULL

  3. SELECT * FROM成員 WHERE id_member IN(....) AND id_member NOT IN (SELECT id_member FROM消息 WHERE poster_time>(UNIX_TIMESTAMP *() - 90 * 24 * 60 * 60) )

+0

謝謝! #1像魅力一樣工作! – Scott

0

在嘗試GROUP BY之前,您可能需要嘗試使用臨時表來計算出max(ms.poster_time)。像這樣的東西應該工作。

SELECT * FROM 
(SELECT 
    m.id_member, 
    m.id_group, 
    from_unixtime(max(ms.poster_time)) 
FROM 
    smf_members m 
    LEFT JOIN smf_messages ms 
    USING(id_member) 
WHERE 
    max(ms.poster_time) < (NOW() < (86400 * 90)) AS tmp 

GROUP BY 
    m.id_member 

這樣做可以讓您將聚合函數與GROUP BY一起使用。如果您有大型數據集,它的表現將不會很好。如果是這樣的話,您可能需要定期總結內部表格生成的數據,然後查詢。