2011-08-11 6 views
0

私たちのサイトには2500の製品があり、60の異なるカテゴリの間にランクされています。私たちのDBスキームは61列で、 "product_id"とラベル付けされています。 "category_1"、 "category_2" ... "category_60"、および2500行は各製品ごとに1つあります。製品が特定のカテゴリー内でランク付けされていない場合、対応するフィールドには「0」とマークされます。もしランク付けされていれば、「1」は1位、「2」は2位などです。私はカラム数が0と等しくない60カラムの平均数を見つけるのを助ける必要があります

通常、商品は2-3カテゴリーにランクされていますので、57+フィールドに「0」を含む列。私の現在のクエリは次のようになります。これにより

mysql_query("SELECT AVG(category_1 + category_2 + category_3 + category_4 + category_5 + category_6 + category_7 + category_8 + category_9 + category_10 + category_11 + category_12 + category_13 + category_14 + category_15 + category_16 + category_17 + category_18 + category_19 + category_20 + category_21 + category_22 + category_23 + category_24 + category_25 + category_26 + category_27 + category_28 + category_29 + category_30 + category_31 + category_32 + category_33 + category_34 + category_35 + category_36 + category_37 + category_38 + category_39 + category_40 + category_41 + category_42 + category_43 + category_44 + category_45 + category_46 + category_47 + category_48 + category_49 + category_50 + category_51 + category_52 + category_53 + category_54 + category_55 + category_56 + category_57 + category_58 + category_59 + category_60) as 'cat_avg' FROM products.rankings WHERE product_id = '$product_id'"); 

、私は列ではなく、AVGの合計を取得しています。たぶんこれは列の代わりに行を選択することと関係がありますが、わかりません。 AVGの代わりにSUMも同様に試しました。

ここからどこに行くのかはわかりません。私が望むのは、列が0に等しくない、1つの製品のすべての列にわたる平均順位です。したがって、product_id 123が7,9,11のランクになり、次に、他の57の列が0の場合、返される平均は.45((7 + 9 + 11 + 0 + 0 + 0 ... + 0))/ 60)

注:私はしなかったこのDBを設計するには、より良い設計方法があると確信していますが、現時点では、それをすばやく統合して迅速に変更することができます。

+3

TRWTFは誰かがおそらくこれが良いアイデアだと思っていたでしょう...私の哀悼の意を表します。 – Jacob

+1

治癒のみがドロップ可能です... –

+1

ハハ、ええ...もしそれが助けになるならば。私は迅速な解決策を探していると思っています。私はそれをすべて再構築するつもりです。 – Erik

答えて

1

DB全体を再構築しました...私の場合と同じくらい悪くはありませんでしたが、私は必要なものを手に入れたMySQLクエリ/更新をたくさんしました。サーバーを数時間緊張させましたが、最後にはそれに見合った価値がありました。

1

これはクエリに多くのストレスがかかる可能性がありますが、これを行うための他の多くの方法はわかりません。与えられたPHPを想定し(

SELECT AVG(
    SELECT * 
    FROM (
    SELECT category_1 AS category FROM table 
    UNION 
    SELECT category_2 AS category FROM table 
    UNION 
    ... 
) cats 
    WHERE category <> 0 
) 
FROM products.rankings 
WHERE product_id = '$product_id' 

それはおそらくページ以内にこの計算を行うために、より理にかなって:

1つのオプションは、指定した列が0でない場合は、サブクエリの列と組合彼らにありますクエリの装飾)と行単位で表示します。上記を行うことは、私たちが話している行の数に応じてサーバーに多くの負荷をかけることになります。

+0

ありがとう、私はこれを試してみよう!私は、平均をホストする新しい列を追加し、このスクリプトを1日に1回更新するcronとして実行すると、ページが読み込まれるたびにクエリを実行する必要はありません。私は、平均で24時間遅れていると誰もが傷つけるとは思わない。 – Erik

+0

@Erik:[UPDATE TRIGGER](http://dev.mysql.com/doc/refman/5.0/en/triggers.html)を使用して、更新時に平均化することもできます。私は、クロンの仕事でさえ集中的になると思うが、それは私かもしれない。 –

関連する問題