0

我正在尝试为我的应用程序构建一个简单的私人消息系统。我设置每条消息的方式都thread_hash与之关联。彼此相关的消息具有相同的thread_hash消息(回复其他消息的消息都具有相同的消息thread_hash

我能够运行一个查询,从每个组(的thread_hash)中选择最后输入的行。我想要完成的是返回具有特定行数的另一列thread_hash而不进行单独的查询

我用我用来生成行的查询创建了一个 SQL Fiddle:http ://sqlfiddle.com/#!2/1d8bd/4

我拥有的唯一信息是用户 ID。我没有thread_hash,所以这必须从 ID 生成。我尝试过使用一些查询来生成行数,但此时我的大脑无法正常工作。

4

2 回答 2

1

我相信您正在寻找这样的查询

SELECT COUNT(*) AS number_msg, thread_hash, from_user_id, mark_read, subject, SUBSTRING(message, 1, 65) as message, messages.time_stamp
FROM `messages`
WHERE `to_user_id` =  '28'
GROUP BY thread_hash
ORDER BY `messages`.`time_stamp` ASC
LIMIT 20 
于 2013-06-23T06:48:27.580 回答
1

您可以这样编写查询:

SELECT
  thread_hash,
  from_user_id,
  mark_read,
  subject,
  SUBSTRING(message, 1, 65) as message,
  messages.time_stamp,
  cnt
FROM
  `messages`
  JOIN (SELECT MAX(messages.id) thead_id, COUNT(*) cnt
        FROM messages
        WHERE messages.to_user_id = 28
        GROUP BY thread_hash) thread_head
  ON `messages`.`id` = `thread_head`.`thead_id`
WHERE `to_user_id` =  '28'
ORDER BY `messages`.`time_stamp` ASC
LIMIT 20

小提琴在这里

但我不确定您是否只需要计算用户 28 的消息,还是所有消息。如果您需要计算所有消息,您可以这样重写您的子查询:

(SELECT MAX(CASE WHEN messages.to_user_id = 28 THEN messages.id END) thead_id,
        COUNT(*) cnt
 FROM messages
 GROUP BY thread_hash) thread_head

在此处查看小提琴。

于 2013-06-23T09:13:09.667 回答