0

thisの重複と見なされる場合がありますが、私の質問はどういうわけかより複雑です。これらのフィールドを持つ MySQL テーブルがあります。

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, ...
  ),
  .
  .
  .
);

評価は、ある IP からの 1 つの製品の訪問数を、その IP によるすべての製品訪問の MAX で割った値に等しくなります。たとえば、次のようになります。

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 クエリは、期待される結果を実際に示していないため、正しくないと思います。

4

1 に答える 1

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;

編集:

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
于 2013-07-28T12:26:55.663 に答える