0

これらのフィールドを持つ 3 つのテーブルがあります。

product_views:ProductMasterID, Date

product_clicks:ProductMasterID, Date

product_master:ProductMasterID, Category

誰かが私のサイトで製品を表示すると、行が に追加されproduct_viewsます。誰かが私のサイトの製品をクリックすると、行が追加されますproduct_clicks

製品の人気を表示する SQL クエリを (MySQL/PHP で) 書き込もうとしています。人気度は、閲覧数とクリック数の合計です。日付範囲も特定のカテゴリ内で選択できるようにしたいと考えています。

日付/カテゴリの制約なしで機能させることができます。現在、日付範囲を追加しようとしています。これは、先週の人気のために、これまでのところ私が持っているものです:

SELECT *, COUNT(*) AS Popularity FROM 

    (SELECT product_views.ProductMasterID, product_views.Date 
         FROM product_views 
         WHERE product_views.Date BETWEEN '".date('Y-m-d',strtotime('now'))."' 
            AND '".date('Y-m-d',strtotime('-7days'))."'"."

UNION ALL 

    SELECT product_clicks.ProductMasterID,product_clicks.Date 
        FROM product_clicks 
        WHERE product_clicks.Date BETWEEN '".date('Y-m-d',strtotime('now'))."' 
           AND '".date('Y-m-d',strtotime('-7days'))."'".") a 

GROUP BY ProductMasterID ORDER BY Popularity DESC LIMIT 100"

機能しないことを除いて、結果は得られません。ただし、句のいずれかを削除するとWHERE、何らかの理由で機能しますが、両方が必要です。だから私の質問は:

  1. WHERE両方の句で機能させる方法
  2. カテゴリ パートの実行方法。たとえば、「食品」のカテゴリを持つ製品のみを選択します。テーブルのどこかで結合を行う必要があると思いますproduct_masterが、扱いにくいようです。

どんな助けでも大歓迎です。

ありがとう

4

1 に答える 1

0

JOINを使用する場合の解決策は次のとおりです。

クエリ:

SELECT M.PMID, M.CATEGORY, 
(COALESCE(V.VCNT,0) +
COALESCE(C.CCNT,0)) AS TOTAL_COUNT
FROM Master M
LEFT JOIN (SELECT PMID, COUNT(*) AS VCNT
           FROM VIEWS
           WHERE DATE between 
           DATE_ADD(NOW(), INTERVAL - 7 DAY)
           and now()
           GROUP BY PMID) V
ON V.PMID = M.PMID
LEFT JOIN (SELECT PMID, COUNT(*) AS CCNT
           FROM CLICKS
           WHERE DATE between 
           DATE_ADD(NOW(), INTERVAL - 7 DAY)
           and now()
           GROUP BY PMID) C
ON C.PMID = M.PMID
GROUP BY M.PMID
;

結果:

| PMID | CATEGORY | TOTAL_COUNT |
---------------------------------
|    1 |    Shoes |           6 |
|    2 |    Books |           4 |
|    3 |     Food |           3 |

UNION を使用し、SQL 部分のみを使用する場合:

SELECT ID, COUNT(*) AS Popularity FROM 
(
    (SELECT product_views.ProductMasterID AS ID, count(*) 
         FROM product_views 
         WHERE product_views.Date BETWEEN '".date('Y-m-d',strtotime('now'))."' 
            AND '".date('Y-m-d',strtotime('-7days'))."'"."
         GROUP BY product_views.ProductMasterID)

UNION ALL 

    (SELECT product_clicks.ProductMasterID AS ID, COUNT(*)
        FROM product_clicks 
        WHERE product_clicks.Date BETWEEN '".date('Y-m-d',strtotime('now'))."' 
           AND '".date('Y-m-d',strtotime('-7days'))."'".") a
     GROUP BY product_clicks.ProductMasterID)

GROUP BY ProductMasterID 
ORDER BY Popularity DESC LIMIT 100"

これはどう?

SELECT M.PMID, M.CATEGORY, COUNT(V.PMID), COUNT(C.PMID)
FROM MASTER M
LEFT JOIN VIEWS V
ON V.PMID = M.PMID
LEFT JOIN CLICKS C
ON C.PMID = M.PMID
WHERE V.DATE BETWEEN NOW() AND NOW() INTERVAL - 7 DAY
AND C.DATE BETWEEN NOW() AND NOW() INTERVAL 7 DAY
GROUP BY M.PMID, V.DATE, C.DATE
;

于 2013-01-17T12:32:06.543 に答える