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 时间戳。到目前为止,我所拥有的是:

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 字段的最新条目?

4

2 回答 2

0

max(ms.poster_time)在尝试GROUP BY. 像这样的东西应该可以工作。

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. 如果您有大型数据集,它的性能将不会很好。如果是这种情况,您可能需要考虑定期汇总内表生成的数据,然后对其进行查询。

于 2011-10-22T22:56:14.077 回答
0

有几种方法可以做到这一点。

  1. SELECT * FROM members WHERE id_member IN ( ... ) AND NOT EXISTS (SELECT 1 from messages WHERE is_member = members.id_member AND poster_time > (UNIX_TIMESTAMP*() - 90 * 24 * 60 * 60)

  2. 寻找外部连接什么也没找到的情况 SELECT DISTINCT id_member FROM MEMBERS AS m ... LEFT JOIN messages AS msg USING .... WHERE msg.id IS NULL

  3. SELECT * FROM members WHERE id_member IN ( .... ) AND id_member NOT IN (SELECT id_member FROM messages WHERE poster_time > (UNIX_TIMESTAMP*() - 90 * 24 * 60 * 60) )

于 2011-10-22T23:46:09.770 回答