sql >> データベース >  >> RDS >> Mysql

投票スコアがゼロまたは正の投稿の数をカウントするにはどうすればよいですか?

    総投票数がゼロ未満の投稿を除外する最も簡単な方法は次のとおりです。

    SELECT count(1)
    FROM qanda question
    JOIN qanda answer ON question.Id = answer.related
    WHERE answer.related IS NOT NULL
    AND answer.user_id = 2
    AND question.free IS NULL
    AND question.id not in (
      select post_id
      from votes
      group by post_id
      having sum(value) < 0)
    

    ここで重要なのは、having sum(value) < 0です。 正味の反対票を持つ投稿を選択します。

    コメントから...

    「悪い」回答が多すぎるユーザーを見つけるには、おそらく、彼らが行った「良い」回答の数を返し、全体として「悪い」ユーザーであるかどうかを判断する必要があります。たとえば、すべてが悪い5つの回答があるユーザーは、両方とも5つの悪い回答があるにもかかわらず、1000の回答が5つしかないユーザーとは大きく異なります。

    これを試してください:

    select
        sum(score < 0) bad,
        count(*) total,
        sum(score < 0) / sum(.01) percent_bad
    from (
        SELECT coalesce(sum(value), 0) score
        FROM qanda question
        JOIN qanda answer ON question.Id = answer.related
        LEFT JOIN votes ON votes.post_id = answer.id
        WHERE answer.related IS NOT NULL
        AND answer.user_id = 2
        AND question.free IS NULL
        AND answer.timestamp > subdate(now(), 365)
        GROUP BY answer.id
    ) scores
    

    そこにあるSQLカンフーに関するいくつかのメモ:

    • MySQLでは、trueは1、falseは0であるため、条件を合計することで、trueの回数をカウントします。これは、不器用なSUM(CASE ...)よりも、コーディングがはるかに簡単で、読みやすくなっています。 他のDBが必要とする式
    • カウントをSUM(.01)で割る (私はところで考えただけです)これは、式を単純化するだけでなく、答えをfloatに一致させるため、整数の算術丸めを自動的に回避するため、パーセンテージを取得する最も簡単な方法です。

    免責事項:コードは、私の電話で親指を立てたようにコンパイルまたは機能しない可能性があります(ただし、機能する可能性は十分にあります)



    1. PHPとmySQL:トランザクションを実装するためのシンプルなコード-コミットとロールバック

    2. mysqlテーブルから最新の日付レコードのセットを選択する方法

    3. 条件付きSQLカウント

    4. FIFO/キューとしてのMySQLテーブル