-1

私は3つのテーブルを持っています

comments(id,question_id, user_Id) // here the user_id is of the user who has asked the question
questions(id,q_desc, user_id)
users(id, name, rank)

ユーザーは質問をしたり、質問にコメントしたりできます。

コメントした上位3人までのユーザーを含むすべての質問を表示したいレポートが必要ですが、質問をしたユーザーはその特定の質問のレポートに含めるべきではありませんが、彼にも彼の質問にコメントする特権。

EDited :::

Select * from comments inner join users(comments.user_id=u.id) group by question_id order by user.rank desc
4

1 に答える 1

4

面倒ですが、機能します。

SELECT 
    a.question_id, a.user_id, a.name, a.rank
FROM
(
    SELECT a.*, b.name, b.rank
    FROM
    (
        SELECT DISTINCT b.question_id, b.user_id
        FROM questions a
        INNER JOIN comments b ON a.id = b.question_id AND a.user_id <> b.user_id
    ) a
    INNER JOIN users b ON a.user_id = b.id
) a
INNER JOIN
(
    SELECT a.question_id, b.rank
    FROM
    (
        SELECT DISTINCT b.question_id, b.user_id
        FROM questions a
        INNER JOIN comments b ON a.id = b.question_id AND a.user_id <> b.user_id
    ) a
    INNER JOIN users b ON a.user_id = b.id
) b ON a.question_id = b.question_id AND a.rank <= b.rank
GROUP BY 
    a.question_id, a.user_id, a.name, a.rank
HAVING 
    COUNT(1) <= 3
ORDER BY 
    a.question_id, a.rank DESC

編集:これは同じ結果を生成し、より簡潔です:

SELECT a.*
FROM
(
   SELECT DISTINCT a.question_id, a.user_id, b.name, b.rank
   FROM comments a
   INNER JOIN users b ON a.user_id = b.id
) a
INNER JOIN 
    questions b ON a.question_id = b.id AND a.user_id <> b.user_id
INNER JOIN
(
   SELECT DISTINCT a.question_id, a.user_id, b.rank
   FROM comments a
   INNER JOIN users b ON a.user_id = b.id
) c ON b.id = c.question_id AND a.rank <= c.rank
GROUP BY 
    a.question_id, a.user_id, a.name, a.rank
HAVING 
    COUNT(1) <= 3
ORDER BY 
    a.question_id, a.rank DESC;

これらのソリューションは、同じ質問に複数のコメントを投稿したユーザーも考慮します。

SQLFiddleで動作中の両方のソリューションを参照してください

于 2012-07-15T07:11:46.957 に答える