0

这是我的问答 SQL 表的简化版本,post_id 是主键。

 post_id | ref_post_id | title  | date (unix timestamp)
   1     |     0       | Title1 |  10 
   2     |     1       |        |  20 
   3     |     0       | Title2 |  30 

当 ref_post_id 为 0 时,这意味着这是一个问题。当它不是 0 时,它是一个数字对应于问题的 post_id 的答案。这意味着第二行是我上面示例中第一行的答案。

我想做的是只得到每个问题的最后一行。如果问题没有任何答案,我想要问题行,但如果它有答案,我想要最后一个答案,但我想加入属于问题行的标题。

我已经用谷歌搜索并尝试了一段时间。希望你能理解我的问题!

谢谢!

4

5 回答 5

2

我建议将您的表格一分为二,一张用于提问,一张用于回答。

这看起来如何的粗略草图:

questions
post_id  |  title  |  date

answers
answer_id  |  post_id  |  answer  |  date

这样,您可以通过以下方式请求所请求问题的最后一个答案:

SELECT * FROM answers WHERE post_id = THE_REQUESTED_POST_ID ORDER BY date DESC LIMIT 1

编辑:

废话对不起,我说错了表格,要从中选择的表格应该是答案。

于 2012-11-01T10:03:59.193 回答
1
SELECT  a.*, b.replyID
FROM    tableName a
        LEFT JOIN tableName c
            ON a.ref_post_ID = c.post_id
        LEFT JOIN
        (
            SELECT ref_post_ID replyID, MAX(DATE) as maxDATE
            FROM tableName
            GROUP BY replyID
        ) latestAnswer
            ON  c.ref_post_ID = latestAnswer.replyID AND
                c.date = latestAnswer.maxDATE

我强烈建议您为此创建一个单独的表,一个用于Question,第二个用于Answers,表中的列是Answers表中的外来Question

于 2012-11-01T10:04:17.870 回答
0

我建议将您的表格分成两张不同的表格,一张用于提问,一张用于回答。

但是,您需要的查询可以这样写:

SELECT posts.*
FROM
  posts INNER JOIN
    (SELECT IF(ref_post_id=0,post_id,ref_post_id) as id, Max(Date) as maxdate
     FROM posts
     GROUP BY id) p
  ON
    (p.maxdate = posts.date) AND
    (p.id =IF(posts.ref_post_id=0,posts.post_id,posts.ref_post_id))

要为每个问题/答案选择最大日期,您必须分组ref_post_id,除了ref_post_id = 0必须分组的情况post_id,因此是 IF。

当您使用子查询将帖子表与自身连接时,您必须使用相同的技巧。

编辑:如果您需要将问题标记为已删除,则必须从上面的选择中删除所有已删除的问题和答案,并且您必须再使用一个子查询来仅选择未删除的问题:

SELECT posts.*
FROM
  posts INNER JOIN
    (SELECT IF(ref_post_id=0,post_id,ref_post_id) as id, Max(Date) as maxdate
     FROM posts
     WHERE EXISTS (SELECT null 
                   FROM posts posts_sub
                   WHERE
                     posts_sub.post_id =
                     IF(posts.ref_post_id=0,posts.post_id,posts.ref_post_id)
                   AND posts_sub.deleted =0)
     GROUP BY id) p
  ON
    (p.maxdate = posts.date) AND
    (p.id =IF(posts.ref_post_id=0,posts.post_id,posts.ref_post_id))
于 2012-11-01T10:45:35.103 回答
0

这个怎么样:

SELECT t.*, lastAnswer.title  FROM tableName t LEFT JION 
(SELECT t1.*
    FROM tableName t1 LEFT JOIN tableName t2
     ON (t1.ref_post_id = t2.ref_post_id AND t1.date < t2.date)
    WHERE t2.ref_post_id IS NULL AND t1.ref_post_id > 0
) lastAnswer
ON t.post_id = lastAnswer.ref_post_id
WHERE t.ref_post_id = 0
于 2012-11-01T10:48:25.563 回答
0

我已经发布了一个解决方案,但假设post_id总是有序的,我更喜欢这个,因为它更简单:

select
  posts.*, posts_1.title
from
  posts left join posts posts_1
  on posts.ref_post_id = posts_1.post_id
where posts.post_id IN (select max(post_id) from posts
group by IF(posts.ref_post_id=0,posts.post_id,posts.ref_post_id))

(我正在使用相同的按ref_post_id或 按分组技巧post_id)。

编辑:如果您只需要选择未删除的帖子,这就是您需要的:

select
  posts.*,
  posts_1.title
from
  posts left join posts posts_1
  on posts.ref_post_id = posts_1.post_id
where
  posts.post_id IN (select max(post_id) from posts
                    where exists (select * 
                      from posts posts_sub
                      where
                        posts_sub.post_id =
                        if(posts.ref_post_id=0,posts.post_id,posts.ref_post_id)
                        and posts_sub.deleted =0)
group by
  IF(posts.ref_post_id=0,posts.post_id,posts.ref_post_id))
于 2012-11-01T11:16:05.633 回答