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 に対応する回答です。つまり、2 行目は上記の例の 1 行目に対する回答です。

私がやりたいことは、すべての質問の最後の行だけを取得することです。質問に回答がない場合は質問行が必要ですが、回答がある場合は最後の回答が必要ですが、質問行に属するタイトルに参加したいです。

私はググって、しばらくの間自分自身を試しました。うまくいけば、あなたは私の問題を理解しています!

ありがとう!

4

5 に答える 5

2

テーブルを 2 つに分けて、1 つは質問用、もう 1 つは回答用にすることをお勧めします。

これがどのように見えるかの大まかなスケッチ:

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ます。AnswersQuestion

于 2012-11-01T10:04:17.870 に答える
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))

(私は byref_post_idまたは byでグループ化するのと同じトリックを使用しています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 に答える
0

テーブルを質問用と回答用の 2 つの異なるテーブルに分割することをお勧めします。

ただし、必要なクエリは次のように記述できます。

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ある場合を除き、したがって IF.ref_post_id = 0post_id

サブクエリを使用して posts テーブルをそれ自体と結合するときは、同じトリックを使用する必要があります。

編集:質問を削除済みとしてマークする必要がある場合は、削除されたすべての質問と回答を上記の選択から削除する必要があり、削除されていない質問のみを選択するには、もう 1 つのサブクエリを使用する必要があります。

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 に答える