2013-12-19 1 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 

То, что я пытаюсь с моим запросом: для каждого продукта, я хотел бы иметь среднее значение ставка. В настоящее время вывод является нулевым, но у меня есть значения в обеих таблицах.

Спасибо.

+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

Почему вы только проверяете, является ли анонимная таблица нулевым значением? Пользователи также могут быть пустыми. – 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

Вы не можете использовать счет и сумму на присоединяется, если вам группа по

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

его не правильно bez его не corect для продукта id 3 и 4 его должно быть 3 bcz только на uesr оценить его, и оно среднее должно быть 3 не 1 .... вы его получите неправильный –

+0

рассчитанный результат сумма рейтинга/номер пользователя (reg + annymou) не соответствует его правилу .... так что проверьте его –

+0

@AmitSingh, что из-за параметров, которые я использую для ifnull. Я описал это в своей публикации. вы можете выбрать все, что хотите, в качестве параметров. – devanand

 Смежные вопросы

  • Нет связанных вопросов^_^