【问题标题】:MySQL count column from multiple tables. Group results by primary idMySQL count 来自多个表的列。按主 ID 分组结果
【发布时间】:2015-10-12 09:25:56
【问题描述】:

我有以下 3 个 MySQL 表:

products

|编号 |姓名 |评论数 | |----|------------|---------------| | 1 |产品A | 10 | | 2 |产品B | 20 | | 3 |产品C | 30 |

products_views

|产品编号 | 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

|产品编号 | 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.countproducts.id 分组在一起,其中product_views.pv_dateproduct_likes.pl_date2015-01-012015-01-03 之间。通过total 订购。

我想要的是: |产品编号 |总计| | ------------|--------| | 3 | 210 | | 2 | 140 | | 1 | 70 |

【问题讨论】:

    标签: php mysql count sum


    【解决方案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
    

    【讨论】:

      【解决方案2】:
      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
      

      【讨论】:

        【解决方案3】:

        在加入之前执行“每个表”的计数,否则您可能会获得比应有的结果更大的结果,因为联接可以使行数成倍增加。此外,由于喜欢或视图中可能不存在某些产品,因此建议对两个“派生表”进行左外连接。

        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
        

        顺便说一句:datecount 是大多数 SQL 方言中的保留字;将列命名为datecount 不是一个好主意;使用更多的东西,例如date_entered、date_created、view_count、like_count 等。

        【讨论】:

          【解决方案4】:
          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
          

          试试这个

          【讨论】:

          • 查询结构错误... GROUP BY 应该在 WHERE 之后
          猜你喜欢
          • 2016-11-27
          • 1970-01-01
          • 1970-01-01
          • 2018-08-11
          • 2011-02-12
          • 2013-09-22
          • 2011-01-21
          • 2012-07-25
          • 1970-01-01
          相关资源
          最近更新 更多