0

私はスクリプトを持っています:

SELECT *, (pbct_hits + (COUNT(likes.rvw_usr_like) * 5) - (COUNT(unlikes.rvw_usr_like)) * 5) AS score
FROM tb_publications
LEFT JOIN tb_reviews_users likes ON likes.rvw_usr_fk_publication = pbct_id AND likes.rvw_usr_like IS TRUE
LEFT JOIN tb_reviews_users unlikes ON unlikes.rvw_usr_fk_publication = pbct_id AND unlikes.rvw_usr_like IS FALSE
GROUP BY pbct_id
ORDER BY score DESC;

同じテーブルに 2 つの結合を作成したくありません。

上記のスクリプトを最適化することは可能だと思いますが、うまくいきません。

編集

問題は解決されました:

-- Final Script:
SELECT pbct.*
FROM tb_publications pbct
LEFT JOIN tb_reviews_users ON rvw_usr_fk_publication = pbct_id
GROUP BY pbct_id
ORDER BY
(
(pbct_hits * 1) +
((SUM(CASE WHEN rvw_usr_like IS TRUE THEN 1 ELSE 0 END)) * 5) -
((SUM(CASE WHEN rvw_usr_like IS FALSE THEN 1 ELSE 0 END)) * 5)
) DESC, pbct_record ASC;

@MikeSmithDev の回答に基づいています。

4

2 に答える 2

1

どうですか

SELECT pbct_id, 
score = 
  (pbct_hits + 
     ((SUM(CASE WHEN rvw_usr_like IS TRUE THEN 1 ELSE 0 END)) * 5) -
     ((SUM(CASE WHEN rvw_usr_like IS FALSE THEN 1 ELSE 0 END)) * 5))
    FROM tb_publications
    LEFT JOIN tb_reviews_users likes ON likes.rvw_usr_fk_publication = pbct_id 
    GROUP BY pbct_id

それはうまくいくはずです...またはPHP側で数学を使ってSQLでもっと簡単なことをします

于 2012-11-11T03:44:01.613 に答える