0

単純なマシンフォーラムのWebフォーラムソフトウェアで、smf_membersとsmf_membersの2つのテーブルを参照しています。smf_membersの各行にはフィールドid_groupがあり、その値に関心があります:1,9,20,26,23,27(IN()句を使用)。一般的な目標は、上記のグループIDにあるsmf_membersテーブルのどの行で、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 に答える