2013-12-19 4 views
2

익명의 사용자와 등록 된 사용자의 요금을 얻으려고합니다. 그들은 다른 테이블에 있습니다.같은 쿼리에서 MySQL 합계 더하기를 계산합니다.

SELECT product.id, (SUM(users.rate + anonymous.rate)/COUNT(users.rate + anonymous.rate)) 
FROM products AS product 
LEFT JOIN users ON users.id_product = product.id 
LEFT JOIN anonymous ON anonymous.id_product = product.id 
GROUP BY product.id 
ORDER BY product.date DESC 

그래서, 테이블은 다음과 같다 : 내 쿼리되어 노력하고있어

users--> 
id | rate | id_product | id_user 
1  2  2   1 
2  4  1   1 
3  5  2   2 

anonymous--> 
id | rate | id_product | ip 
1  2  2   192..etc 
2  4  1   198..etc 
3  5  2   201..etc 

: 각 제품에 대해, 내가 비율의 평균을 가지고 싶습니다. 현재 출력은 null이지만 두 테이블 모두에 값이 있습니다.

감사합니다.

+0

['AVG'] (http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_avg)를 사용하지 않는 이유는 무엇입니까? –

+0

나는 헛되이 노력했다. 'AVG (SUM (...))'-> 그룹 함수를 잘못 사용했습니다. – user3065191

+0

SUM/COUNT가 보이지 않습니까? – user3065191

답변

1

이 같은 시도 ..

SELECT product.id, (SUM(ifnull(ur.rate,0) + ifnull(ar.rate,0))/(COUNT(ur.rate)+Count(ar.rate))) 
FROM products AS product 
LEFT JOIN users_rate AS ur ON ur.id_product = product.id 
LEFT JOIN anonymous_rate AS ar ON ar.id_product = product.id 
GROUP BY product.id 

Sql Fiddle Demo

+0

익명 테이블이 null 값인 경우에만 확인하는 이유는 무엇입니까? 사용자는 null 일 수도 있습니다. – user3065191

+0

수정 사항을 보았습니다. 하지만 작동하지 않습니다. 그것은 평균을 제공하지 않습니다. 나는 6의 값을 얻는다. 나는 3의 비율로 두 개의 값 (각 테이블에 하나씩)을 가지고있다. (3 + 3) = 6의 합계이지만 3을 가져야한다. – user3065191

+0

@ user3065191 try 업데이트 된 답변 –

0

먼저 테이블 내의 각 제품에 대해 교차 조인을 얻고 있습니다. 이것은 당신이 정말로 원하는 것이 아닙니다. 나는 이것이 당신이

SELECT p.id, 
     (coalesce(u.sumrate, 0) + coalesce(a.sumrate, 0))/coalesce(u.num, 0) + coalesce(a.num, 0)) 
FROM products p LEFT JOIN 
    (select id_product, sum(rate) as sumrate, count(*) as num 
     from users u 
     group by id_product 
    ) u 
    ON u.id_product = p.id left join 
    (select id_product, sum(rate) as sumrate, count(*) as num 
     from anonymous a 
     group by id_product 
    ) a 
    ON a.id_product = p.id 
ORDER BY p.date DESC; 

id 제품 테이블에서 고유한지 가정 찾고있는 가까운 생각, 당신은 외부 수준에서 집계가 필요하지 않습니다.

+0

나는 당신과 모순되지 않으려 고하지만 나는 그것이 내가 원하는 것에 많이 있다고 생각한다. 네가 맞아. 끝내 준다. 현재 다음과 같은 솔루션을 시도 중이다. http://sqlfiddle.com/#!2/54b12/1 – user3065191

0
I가 확인했습니다

CREATE TABLE products (id integer); 
CREATE TABLE users_rate (id integer, id_product integer, rate integer, id_user integer); 
CREATE TABLE anonymous_rate (id integer, id_product integer, rate integer, ip varchar(25)); 

INSERT INTO products VALUES (1); 
INSERT INTO products VALUES (2); 
INSERT INTO products VALUES (3); 
INSERT INTO products VALUES (4); 

INSERT INTO users_rate VALUES(1, 1, 3, 1); 
INSERT INTO users_rate VALUES(1, 2, 3, 1); 
INSERT INTO users_rate VALUES(1, 3, 3, 1); 
INSERT INTO users_rate VALUES(1, 4, 3, 1); 

INSERT INTO anonymous_rate VALUES(1, 1, 3, '192..'); 
INSERT INTO anonymous_rate VALUES(1, 2, 3, '192..'); 

select p.id, 
ifnull(
    (ifnull((select sum(rate) from users_rate where id_product = p.id), 0) + 
    ifnull((select sum(rate) from anonymous_rate where id_product = p.id), 0)) 
/
    (ifnull((select count(rate) from users_rate where id_product = p.id), 0) + 
    ifnull((select count(rate) from anonymous_rate where id_product = p.id), 0)), 0 ) 
from products as p 
group by p.id 

http://sqlfiddle.com/#!2/a2add/8

에 의해 그룹 당신에게 당신은에 수와 합계를 사용할 수 없습니다

조인 sqlfiddle. 요금이 없을 때 0이 주어집니다. 너는 그것을 바꿀지도 모른다.

+0

자사의 제품 ID 3 및 4에 대한 올바른 bez 해당하지 coret 자사의 uesr에만 그것을 3 bcz해야하고 그것을 평균 3 아니야 1 .... 당신이 그것을 얻을 잘못된 –

+0

계산 된 결과/사용자 (reg + annymou)의 합계가 잘못됨 .................. –

+0

@AmitSingh ifnull에 사용하는 매개 변수 때문입니다. 나는 그것을 나의 게시에서 기술했다. 매개 변수로 원하는 것을 선택할 수 있습니다.제품 3 및 4에 대한 – devanand