2013-07-28 1 views
0

Это может быть дубликат для this, но мой вопрос как-то усложнен. У меня есть таблица MySQL с этими полями:Комплекс SQL SELECT для вычисления рейтинга на одном столбце

ip | product_id | visits 

, который показывает, сколько раз ip посетил продукт. В конце концов я хочу, чтобы создать массив PHP так:

product_rating_for_ip = array(
    ip=>array(
    product_id=>rating, product_id=>rating, ... 
), 
    ip=>array(
    product_id=>rating, product_id=>rating, ... 
), 
    . 
    . 
    . 
); 

Оценка равно посещений для одного продукта от некоторого ф, деленной на MAX всех посещений продукции этой ф .for Например:

product_rating_for_ip = array(
    "78.125.15.92"=>array(
    1=>0.8,2=>0.2,3=>1.0 
), 
    "163.56.75.112"=>array(
    1=>0.1,2=>0.3,3=>0.5,8=>0.1,12=>1.0 
), 
    . 
    . 
    . 
); 

То, что я сделал:

SELECT ip, id, visits, MAX(visits) FROM visit GROUP BY ip 

У меня есть соображения производительности, и я хочу избежать запросов SQL в вложенных циклах. Я думаю, что указанный выше SQL-запрос неверен, поскольку он не показывает ожидаемые результаты в действии.

+0

«оценка равно посещения для одного продукта от некоторого ф, деленного на MAX всех посещений продукта по этой ф» Похож, это 'SUM', а тх n 'MAX'. – mishik

+0

Нет, это МАКС. продукт с максимальными посещениями является основой для сравнения и оценки других продуктов. продукт с максимальными посевами имеет рейтинг 1 из 1, а другие имеют более низкие рейтинги от 0 до 1 – Trix

+1

И все же в вашем примере нет продукта имеет рейтинг 1. – mishik

ответ

1

Идея заключается в том, чтобы использовать подзапрос для вычисления суммы, а затем сделать расчет и положить значения в одну разделителях запятых колонка, которую можно преобразовать в массив в PHP:

select v.ip, group_concat(v.visits/iv.maxvisits) as ratings 
from visit v join 
    (SELECT ip, id, visits, max(visits) as maxvisits 
     FROM visit 
     GROUP BY ip 
    ) iv 
    on v.ip = iv.ip 
group by v.ip; 

EDIT :

Таблицы в SQL по сути неупорядочены и сортировка в SQL нестабильна (это означает, что исходный порядок не сохраняется). Вы можете указать порядок в инструкции group_concat(). Например, нижеприведенный упорядочить результаты по id:

select v.ip, group_concat(v.visits/iv.maxvisits order by id) as ratings 
from visit v join 
    (SELECT ip, id, visits, max(visits) as maxvisits 
     FROM visit 
     GROUP BY ip 
    ) iv 
    on v.ip = iv.ip 
group by v.ip; 

И это будет заказ по самым высоким рейтингом первого:

select v.ip, group_concat(v.visits/iv.maxvisits order by v.visits desc) as ratings 

Вы можете сделать список более сложным включить id в нем, как хорошо:

select v.ip, 
     group_concat(concat(v.id, ':', v.visits/iv.maxvisits)) as ratings 
+0

Спасибо, но как насчет генерации php-массива. Я думаю, что части тоже отстой. не могли бы вы заполнить ответ, чтобы покрыть эту часть? – Trix

+0

Я выполнил запрос. Он не сохраняет порядок значений. Зачем? – Trix

+0

Я выполнил запрос. Он не сохраняет порядок значений. Зачем? например, для одного ip он присваивает рейтинг как: 0.2500,0.5000,1.0000 для (4,1,2) – Trix

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

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