簡體   English   中英

子查詢計算分數

[英]sql - sub-queries calculate score

我有一個代碼可以為使用不同表的用戶計算分數,我是通過Codeigniter和sql中的php編寫的,但這有一個很大的問題,那就是太慢了

 public function getTopUsers($request) {
        // return $request;

        $query = $this->db->query("
            SELECT * FROM users
            WHERE user_is_block = 0
            AND user_is_paid = 1
            ORDER BY id ASC"
        )->result_array();

        foreach($query as $key=>$value) {
            unset($query[$key]['user_token']);
            unset($query[$key]['user_confirmation_token']);
            unset($query[$key]['user_password']);
            $query[$key]['user_score'] = ( ($this->countInvitationByUserID($query[$key]['id']) * 1000) + ($this->getUserLikedCount($query[$key]['id'])) );
        }

        usort($query, function($a, $b) {
            if($b['user_score'] == $a['user_score'])
                return $a['id'] - $b['id'];
            else
                return $b['user_score'] - $a['user_score'];
        });


        return $query;
    }


    public function countcouponByUserID($id) {
        $query = $this->db->query("
            SELECT * FROM payment, coupon, users
            WHERE payment.payment_coupon_id = coupon.id
            AND coupon.coupon_token = users.user_coupon_token
            AND users.id = ?
            AND payment.payment_status = 1", array($id)
        );
        return $query->num_rows();
    }

    public function getUsertabCount($id) {
        $query = $this->db->query("
            SELECT * FROM `users`, post, `tab`
            WHERE users.id = post.post_user_id
            AND tab.tab_post_id = post.post_id
            AND users.id = ?
            AND post.post_is_active = 1", array($id)
        );
        return $query->num_rows();
    }

現在的問題是,這段代碼太繁瑣且太慢,我無法在一個查詢中編寫該代碼

謝謝

您可以使用JOIN在單個查詢中計算所有內容,例如:

SELECT u.id, (COUNT(p.*) * 100  - COUNT(l.*)) AS score
FROM users u LEFT JOIN coupon c ON u.user_coupon_token = c.coupon_token 
LEFT JOIN payment p ON p.payment_coupon_id = c.id
LEFT JOIN post po ON u.id = po.post_user_id
LEFT JOIN like l ON l.like_post_id = po.post_id
WHERE u.user_is_block = 0 
AND u.user_is_paid = 1
AND (p.payment_status IS NULL OR p.payment_status = 1)
AND (po.post_is_active IS NULL OR po.post_is_active = 1)
GROUP BY u.id;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM