2

以下にテーブルのリストを示します。

場所 [23,24,25,26,27] の商品のクリック数の合計に基づいて、ショップ ID を降順に並べ替えます。

与えられた product_id = 8


link_shops_locations

shop_id | location_id
---------------------
1       | 23
2       | 24
3       | 25
3       | 26
3       | 27

products_clicks

shop_id | product_id | clicks
-----------------------------
1       | 8          | 1
2       | 7          | 3
2       | 8          | 87
3       | 8          | 21
3       | 8          | 9

link_products_shops

product_id | shop_id
---------------------
 7         | 1
 8         | 1
 8         | 1
 8         | 2
 8         | 2
 8         | 1
 7         | 3
 8         | 3

これは私が試したものです、

SELECT SUM(c.clicks) as no,
       s.shop_id
FROM  link_products_shops l
INNER JOIN products_clicks c
ON c.product_id = l.product_id
INNER JOIN link_shops_locations s
ON s.shop_id = c.shop_id // duplicate shop_ids gives wrong SUM
WHERE s.location_id IN (23,24,25,26,27)
GROUP BY s.shop_id
ORDER BY no DESC;

私の問題は、link_shops_locations テーブルに 3 つの shop_id があるため、結果として期待される SUM が 3 倍になることです。これを解決するにはどうすればよいですか? これには link_shops_locations の INNER JOIN 条件が関係しているのでしょうか。少しの助けが非常に役立ちます。

4

1 に答える 1

0

[1] products_clicks の INNER JOIN でもう1 つの条件が欠落しています。

[2]あなたも無視しproduct_idました。このクエリを見てください。

product_id=8 and shop_id=1[3]表に3回挿入しましたlink_products_shops

    select shop_id, SUM(NoOfClicks) FROM(SELECT distinct c.shop_id, c.clicks AS NoOfClicks 
FROM  products_clicks c 
INNER JOIN link_products_shops l 
ON c.product_id = l.product_id 
AND c.shop_id = l.shop_id 
INNER JOIN link_shops_locations s 
ON s.shop_id = c.shop_id and s.shop_id = l.shop_id 
WHERE s.location_id IN (23,24,25,26,27) 
AND c.product_id = 8) AS TabShopCounters
GROUP BY shop_id
ORDER BY NoOfClicks DESC;

SQL フィドル - http://www.sqlfiddle.com/#!2/b22fe/8

于 2013-03-11T20:59:15.277 に答える