我有以下3个MySQL表:
products
| id | name | comment_count | |----|-----------|---------------| | 1 | Product A | 10 | | 2 | Product B | 20 | | 3 | Product C | 30 |
products_views
| product_id | pv_count | pv_date | | -----------|-------|------------| | 1 | 10 | 2015-01-01 | | 1 | 10 | 2015-01-02 | | 1 | 10 | 2015-01-03 | | 2 | 20 | 2015-01-01 | | 2 | 20 | 2015-01-02 | | 2 | 20 | 2015-01-03 | | 3 | 30 | 2015-01-01 | | 3 | 30 | 2015-01-02 | | 3 | 30 | 2015-01-03 |
products_likes
| product_id | pl_count | pl_date | | -----------|-------|------------| | 1 | 10 | 2015-01-01 | | 1 | 10 | 2015-01-02 | | 1 | 10 | 2015-01-03 | | 2 | 20 | 2015-01-01 | | 2 | 20 | 2015-01-02 | | 2 | 20 | 2015-01-03 | | 3 | 30 | 2015-01-01 | | 3 | 30 | 2015-01-02 | | 3 | 30 | 2015-01-03 |
我想在products.comment_count
之间添加product_views.count
+ product_likes.count
+ products.id
分组,其中product_views.pv_date
和product_likes.pl_date
在{{1}之间}和2015-01-01
。按2015-01-03
订购。
| product_id | total | | -----------|-------| | 3 | 210 | | 2 | 140 | | 1 | 70 |
答案 0 :(得分:1)
尝试此查询
SELECT
p.product_id,
(p.comment_count + SUM(pv.count) + SUM(pl.count)) AS total
FROM products p
JOIN products_views pv ON( p.product_id = pv.product_id)
JOIN products_likes pl ON( p.product_id = pl.product_id)
WHERE pl.date BETWEEN '2015-01-01' AND '2015-01-03'
AND pv.date BETWEEN '2015-01-01' AND '2015-01-03'
GROUP BY p.product_id
ORDER BY total DESC
答案 1 :(得分:0)
SELECT
(products.comment_count+products_views.pv_count+products_likes.pl_count) AS product_count
FROM products
INNER JOIN products_views.product_id=products.id
INNER JOIN products_likes.product_id=products.id
WHERE (product_views.pv_date BETWEEN dateVal AND dateVal)
AND (products_likes.pl_date BETWEEN dateVal AND dateVal)
GROUP BY products.id
ORDER BY product_count
答案 2 :(得分:0)
在加入之前执行“每个表”的计数,否则你冒着获得更大结果的风险,因为连接可以乘以行数。此外,由于某些产品可能不存在于喜欢或视图中,因此建议对两个“派生表”进行左外连接。
SELECT
p.product_id
, (IFNULL(p.comment_count,0) + IFNULL(pv.view_count, 0) + IFNULL(pl.like_count, 0)) AS total
FROM products p
LEFT OUTER JOIN (
SELECT
product_id
, SUM(`count`) AS view_count
FROM products_views
WHERE `date` BETWEEN '2015-01-01' AND '2015-01-03'
GROUP BY
product_id
) pv ON p.product_id = pv.product_id
LEFT OUTER JOIN (
SELECT
product_id
, SUM(`count`) AS like_count
FROM products_likes
WHERE `date` BETWEEN '2015-01-01' AND '2015-01-03'
GROUP BY
product_id
) pl ON p.product_id = pl.product_id
GROUP BY
p.product_id
ORDER BY
total DESC
btw:date
和count
是大多数SQL方言中的保留字;将列命名为date
或count
不是一个好主意;使用更多例如date_entered,date_created,view_count,like_count等。
答案 3 :(得分:-2)
select p.product_id, sum(p.comment_count) + sum(v.count) + sum(l.count) as total from products p join products_views v on p.product_id = v.product_id join products_likes l on p.product_id = l.product_id group by p.product_id
where l.date between '2015-01-01' and '2015-01-03'
order by total desc
试试这个