1

首先让我给你们 SQLFiddle:http ://sqlfiddle.com/#!2/1d8bd/11

我已经为此工作了一段时间,并且面临着一些程序员(和作家)的障碍。

这是我试图在 MySQL 中完成的示例伪代码:

Return all rows WHERE {
  IF `to_user_id` = '27' AND `to_delete` >= SUBDATE(NOW(), INTERVAL 720 HOUR) 
     RETURN to_delete as del_time, COUNT(*), MAX(subject),

      - OR -

  IF `from_user_id` = '27' AND `from_delete` >= SUBDATE(NOW(), INTERVAL 720 HOUR) )
     RETURN from_delete as del_time, COUNT(*), MAX(subject),
} GROUP BY thread_hash

我本质上是在构建一个私人消息系统,这是代表垃圾箱的查询。相同的行thread_hash表示线程中的消息。当用户从他们的收件箱中删除一个线程时,它会将所有to_delete设置NOW()为该特定的thread_hash. 当用户从他们的发件箱中删除一个线程时,它from_deleteNOW()为该特定的thread_hash.

我正在尝试构建的查询应该返回所有行 if to_user_id= $user_id AND to_delete有一个值 OR if from_user_id= $user_id AND from_delete有一个值,按thread_hash (即您从收件箱或发送箱中删除的线程)分组

我希望我在这里很清楚。请让我知道我是否可以清除其他任何内容。

4

1 回答 1

1

你很接近,一个简单的UNION ALL应该做你想做的事;

SELECT MAX(del_time), COUNT(*) cnt, MAX(subject) subject FROM (
  SELECT to_delete del_time, thread_hash, subject
  FROM messages
  WHERE to_user_id = 27 AND `to_delete` >= SUBDATE(NOW(), INTERVAL 720 HOUR)
  UNION ALL
  SELECT from_delete del_time, thread_hash, subject
  FROM messages
  WHERE from_user_id = 27 AND `from_delete` >= SUBDATE(NOW(), INTERVAL 720 HOUR)
) a
GROUP BY thread_hash;

修改后的 SQLfiddle 用于测试

于 2013-07-16T17:00:26.107 回答