2017-12-08 14 views
2

私のサイトにコメントセクションがあり、注文したい:
1.ユーザーがトップにコメントを固定している場合は、最初に表示するコメントが必要です
2.その後、私は
4.最後に、私はMySqlの複数の列によるコメントセクションの注文

とコメントの残りの部分をしたいブログを読んで、ユーザーによって行われたコメントをしたい
3.その後、ブログを書いたユーザーによって行われたコメントをしたいです私は各セクション(1〜4)を次の順序で並べ替えたい:
1.コメントのupvotes/downvotesに基づくスコアとh

------------------------------------------------ 
| pin | username | score | date comment posted | 
------------------------------------------------ 
| 1 | Bob  | 2  | 2017-01-25 13:45:01 | // First the pins ordered by Bob, Alice, score, date 
------------------------------------------------ 
| 1 | Bob  | 1  | 2017-06-12 18:42:54 | 
------------------------------------------------ 
| 1 | Alice | 20 | 2017-03-21 12:51:42 | 
------------------------------------------------ 
| 1 | Jack  | 30 | 2015-02-27 12:58:32 | 
------------------------------------------------ 
| NULL| Bob  | 11 | 2016-11-21 10:41:35 | // Then Bob's (as writer of blog) comments ordered by score, date 
------------------------------------------------ 
| NULL| Bob  | 11 | 2016-10-30 23:56:01 | 
------------------------------------------------ 
| NULL| Bob  | 9  | 2017-12-24 12:00:00 | 
------------------------------------------------ 
| NULL| Alice | 30 | 2017-04-21 13:48:05 | // Then Alice's (as reader of blog) comments ordered by score, date 
------------------------------------------------ 
| NULL| Alice | 30 | 2016-12-01 15:37:12 | 
------------------------------------------------ 
| NULL| Alice | 7  | 2017-05-21 11:12:11 | 
------------------------------------------------ 
| NULL| Jack  | 93 | 2012-12-21 00:00:00 | // Then all other comments ordered by score, date 
------------------------------------------------ 
| NULL| Jill  | 92 | 2015-04-08 15:45:29 | 
------------------------------------------------ 
| NULL| Andrew | 92 | 2014-12-31 19:45:12 | 
------------------------------------------------ 
| NULL| Jack  | 32 | 2017-01-12 23:12:57 | 
------------------------------------------------ 
. 
. 
. 
(ボブはブログを書いて、アリスはそれを読んでいる):OW多くの回答(コメント=活性)コメントコメントをので、結果はこのようになるはずです

を投稿されました
2.日付を受け取っ

しかし、私が得た結果は、ピン/ NULLで正しく並べ替えられています...
しかし、ピンがORDER BYの最初のものであれば、ORDER BYの残りの部分(つまり、ピンBY ORDER、...)それはボブ、アリス、日付、スコアによって順序付け...

だから私以上の結果ではなく、次のようになり得る:なぜ

------------------------------------------------ 
| pin | username | score | date comment posted | 
------------------------------------------------ 
| 1 | Jack  | 30 | 2015-02-27 12:58:32 | 
------------------------------------------------ 
| 1 | Alice | 20 | 2017-03-21 12:51:42 | 
------------------------------------------------ 
| 1 | Bob  | 2  | 2017-01-25 13:45:01 | 
------------------------------------------------ 
| 1 | Bob  | 1  | 2017-06-12 18:42:54 | 
------------------------------------------------ 
| NULL| Jack  | 93 | 2012-12-21 00:00:00 | 
------------------------------------------------ 
| NULL| Jill  | 92 | 2015-04-08 15:45:29 | 
------------------------------------------------ 
| NULL| Andrew | 92 | 2014-12-31 19:45:12 | 
------------------------------------------------ 
| NULL| Jack  | 32 | 2017-01-12 23:12:57 | 
------------------------------------------------ 
| NULL| Alice | 30 | 2017-04-21 13:48:05 | 
------------------------------------------------ 
| NULL| Alice | 30 | 2016-12-01 15:37:12 | 
------------------------------------------------ 
| NULL| Bob  | 11 | 2016-11-21 10:41:35 | 
------------------------------------------------ 
| NULL| Bob  | 11 | 2016-10-30 23:56:01 | 
------------------------------------------------ 
| NULL| Bob  | 9  | 2017-12-24 12:00:00 | 
------------------------------------------------ 
| NULL| Alice | 7  | 2017-05-21 11:12:11 | 
------------------------------------------------ 
. 
. 
. 

をそれ?それを修正するために私は何ができますか?

情報あなたがそれを必要とする場合:

SELECT文を(コピー/貼り付けのための未編集)

SELECT comment.id AS commentID , comment.date AS cDate , comment.comment AS cComment , comment.pin AS cPin , comment.randomString AS cRandomString , commentuser.username AS cuUsername , commentuser.randomString AS cuRandomString , (SELECT COUNT(*) FROM commentvote AS commentvote WHERE commentvote.commentID = comment.id AND commentvote.voteUp = 1) AS cVoteUp , (SELECT COUNT(*) FROM commentvote AS commentvote2 WHERE commentvote2.commentID = comment.id AND commentvote2.voteDown = 1) AS cVoteDown , ((SELECT COUNT(*) FROM commentvote AS commentvoteup WHERE commentvoteup.commentID = comment.id AND commentvoteup.voteUp = 1) - (SELECT COUNT(*) FROM commentvote AS commentvotedown WHERE commentvotedown.commentID = comment.id AND commentvotedown.voteDown = 1) + (SELECT COUNT(*) FROM comment AS comment2 WHERE comment2.commentID = comment.id)) AS score FROM comment AS comment LEFT JOIN userlogininfo AS commentuser ON commentuser.id = comment.userID LEFT JOIN blog AS blog ON blog.randomString = ? INNER JOIN userlogininfo AS viewer ON viewer.randomString = ? INNER JOIN userlogininfo AS author ON author.id = blog.userID WHERE comment.blogID = blog.id AND comment.commentID IS NULL ORDER BY CAST(comment.pin AS UNSIGNED) DESC , CAST(author.id AS UNSIGNED) DESC , CAST(viewer.id AS UNSIGNED) DESC , CAST(score AS UNSIGNED) DESC , CAST(comment.date AS UNSIGNED) DESC 

SELECT文を(読みやすい)

SELECT 
    comment.id AS commentID , 
    comment.date AS cDate , 
    comment.comment AS cComment , 
    comment.pin AS cPin , 
    comment.randomString AS cRandomString , 
    commentuser.username AS cuUsername , 
    commentuser.randomString AS cuRandomString , 

    ( 
    SELECT 
     COUNT(*) 
    FROM commentvote 
    AS commentvote 
    WHERE 
     commentvote.commentID = comment.id 
     AND commentvote.voteUp = 1 
    ) 
    AS cVoteUp , 

    ( 
    SELECT 
     COUNT(*) 
    FROM commentvote 
    AS commentvote2 
    WHERE 
     commentvote2.commentID = comment.id 
     AND commentvote2.voteDown = 1 
    ) 
    AS cVoteDown , 

    ( 
     ( 
     SELECT 
      COUNT(*) 
     FROM commentvote 
     AS commentvoteup 
     WHERE 
      commentvoteup.commentID = comment.id 
      AND commentvoteup.voteUp = 1 
     ) 
     - // minus 
     ( 
     SELECT 
      COUNT(*) 
     FROM commentvote 
     AS commentvotedown 
     WHERE 
      commentvotedown.commentID = comment.id 
      AND commentvotedown.voteDown = 1 
     ) 
     + // plus 
     ( 
     SELECT 
      COUNT(*) 
     FROM comment 
     AS comment2 
     WHERE 
      comment2.commentID = comment.id 
     ) 
    ) 
    AS score 

FROM comment 
AS comment 

LEFT JOIN 
    userlogininfo 
AS commentuser 
ON 
    commentuser.id = comment.userID 

LEFT JOIN 
    blog 
AS blog 
ON 
    blog.randomString = ? 

INNER JOIN 
    userlogininfo 
AS viewer 
ON 
    viewer.randomString = ? 

INNER JOIN 
    userlogininfo 
AS author 
ON 
    author.id = blog.userID 

WHERE 
    comment.blogID = blog.id 
    AND comment.commentID IS NULL 

ORDER BY 
    CAST(comment.pin AS UNSIGNED) DESC , // first order by pin/not-pin 
    CAST(author.id AS UNSIGNED) DESC , // then order each by author/not-author 
    CAST(viewer.id AS UNSIGNED) DESC , // then order not-author by viewer/rest 
    CAST(score AS UNSIGNED) DESC , // then order pin/author/viewer/rest by score 
    CAST(comment.date AS UNSIGNED) DESC // then order pin/author/viewer/rest/score by date 

userlogininfoテーブル:

-------------------------------- 
| id | username | randomString | 
-------------------------------- 
| 1 | Bob  | lkjsdf786dsf | 
-------------------------------- 
| 2 | Jack  | 78dsauhkwhe7 | 
-------------------------------- 
| 3 | Jill  | asd78687asyd | 
-------------------------------- 
| 4 | Alice | ua67asdsd87j | 
-------------------------------- 
| 5 | Andrew | sadf987dsf7s | 
-------------------------------- 
. 
. 
. 

ブログテーブル

------------------------------ 
| id | userID | randomString | 
------------------------------ 
| 1 | 3  | sad86f7s8d67 | 
------------------------------ 
| 2 | 1  | isuydf786iuh | 
------------------------------ 
| 3 | 2  | 876sdfhgwegk | 
------------------------------ 
. 
. 
. 

コメント-テーブル私は困惑しているため

----------------------------------------------- 
| id | userID | commentID | voteUp | voteDown | 
----------------------------------------------- 
| 1 | 2  | 3   | 1  | NULL  | 
----------------------------------------------- 
| 2 | 4  | 3   | 1  | NULL  | 
----------------------------------------------- 
| 3 | 3  | 2   | NULL | 1  | 
----------------------------------------------- 
| 4 | 2  | 2   | 1  | NULL  | 
----------------------------------------------- 
. 
. 
. 

ホープ誰かが助けることができる

--------------------------------------------------------------------------- 
| id | date | userID | blogID | commentID | pin | ... All info needed ... | 
--------------------------------------------------------------------------- 
| 1 |<date>| 3  | 2  | NULL  | 1 |       | 
--------------------------------------------------------------------------- 
| 2 |<date>| 4  | 1  | 1   | NULL|       | // is an answer to comment with id 1 
--------------------------------------------------------------------------- 
. 
. 
. 

commentvoteテーブル...事前のおかげで...

+0

ピンをブール値のようなものですか?それはまたあなたの注文にあなたを助けるかもしれません... – Ivonet

+0

こんにちは、ここであなたのサンプルデータとsqlfiddleです。残念ながら、クエリは実行されません。「パラメータ1に値が指定されていません」と表示されますが、それを修正できます:http://sqlfiddle.com/#!9/baae07/1 – biziclop

+0

悲しいことに、 (ピンでもピンでもうまく注文できます...注文の順序でどこに置いてもスクロールが注文を引き継ぐので、それはうまくいきません) – APM

答えて

1

試用:

あなたは、単に自動車を追加することで、クエリは次のように合計を返すあなたのvotecountテーブルに列を生成することができます
ORDER BY pin DESC, FIELD(username, 'alice', 'bob') DESC, score DESC, date DESC 

:あなたはそれ0または1その後、イソNULLにするべきではありません

ALTER TABLE commentvote ADD COLUMN votes int GENERATED ALWAYS AS (voteUp-voteDown) 
+0

申し訳ありません..私が以前に行った解決策は、ユーザーが作成したピン= 3 ... then 1.作成者(ピン!= 3)のピンを2に更新し、ピンwriビューア(ピン!= 3)から1 ... 2へのテンション.2。問い合わせ - ORDER BYピンDESC、スコアDESC、日付DESC ...そして最後に1または2のピンをNULLに戻します。私がそれらを望んだように - 最初に表示されたユーザー(ピン3)のコメント - その後、作成者(ピン2)のコメント - 視聴者(ピン1)のコメント - 最後に残りのスコアは、それはたくさんコードする方法でした – APM

+0

いいえ、それはあなたの望む結果[上記の例を参照してください](http://sqlfiddle.com/#!9/783c9e/1/0) – miknik

+0

私の悪い...私はそれをテストしたときとまったく同じように出力します...私は名前をフィールドbeacuseとして使用することができませんでした名前は2つの異なる左の結合から来る - 私は同じソースから来たので、著者とビューアのuserIDのに切り替えた(と同じことを - すなわち。ユーザーを識別する - ユーザー名よりも優れている)...しかし、遅い時間と急いで、私は誤ってidを(comment.idのように)使用しました...まだ、私にウインキーな結果を残しました。それをもう一度テストしました(今userID - duhで)、それは完璧に動作します...ありがとう、upvoteと答えはあなたのものです:D – APM

関連する問題