0

私はこのクエリを持っています:

SELECT   (COUNT (questions.id) / 10) AS totalPages,
          COUNT (DISTINCT answers.id) AS answers,
          COUNT (DISTINCT views.id) AS views,
                (SELECT(COUNT (if (votes.vote = 'up', 1, NULL)) - COUNT (if (votes.vote = 'down', 1, NULL)))
                   FROM   votes
                  WHERE   table = 'questions' AND tableId = questions.id) AS votes
FROM               questions
                LEFT JOIN
                   users
                ON questions.USER = users.id
             LEFT JOIN
                answers
             ON questions.id = answers.question
          LEFT JOIN
             views
          ON questions.id = views.question
       LEFT JOIN
          votes
       ON questions.id = votes.tableId AND votes.table = 'questions'
GROUP BY   questions.id
ORDER BY   questions.date DESC
LIMIT :limit

この投稿のトピックは、votesフィールドについてです。それは非常に最適化されていないと感じており、それを実装する方法について別の方法に取り組む手助けが必要です.

voteの tableID が question.id と等しいすべての結果を取得し、テーブルvote内のフィールドvotesがアップの場合は 1 としてカウントし、そうでない場合は 1 を引きます (明らかにダウンになるため)。

サブクエリを使用せずに試してみました

SUM( IF(votes.vote='up',1,-1) ) as votes

しかし、グループ化すると、結果は非常に間違ったものになります。追加も試みましDISTINCTたが、すべての値が -1 または 1 になりました。

4

1 に答える 1

0

SELECT 部分にサブクエリが必要かどうかわかりません。これを試して:

SELECT 
    count(questions.id)/10 AS totalPages, 
    count(DISTINCT answers.id) as answers, 
    count(DISTINCT views.id) as views, 
    count(if(votes.vote='up', 1, null)) - count(if(votes.vote='down', 1, null))) as votes 
FROM 
    questions 
        LEFT JOIN users ON questions.user=users.id 
        LEFT JOIN answers ON questions.id=answers.question 
        LEFT JOIN views ON questions.id=views.question 
        LEFT JOIN votes ON questions.id=votes.tableId AND votes.`table`='questions' 
GROUP BY questions.id 
ORDER BY questions.date DESC 
LIMIT :limit
于 2013-11-05T01:59:51.250 に答える