mysql counting rows with loop

前端 未结 3 992
旧巷少年郎
旧巷少年郎 2021-01-25 07:31

I have the following table:

+-------------+--------------+ 
| product     | purchased    |
+-------------+--------------+ 
| Hammer      |   |
|         


        
3条回答
  •  一整个雨季
    2021-01-25 08:15

    Better normalization would speed up this query tremendously, but here's an example to work from:

    First, you need to start with your base query, the one that will drive the results. In this case, it's a list of all the products in your table:

    SELECT DISTINCT product
    FROM   productWarranty
    

    The above query creates a sort of "temp" table that we can base our queries on. If you have a separate, normalized product table then that would be much better.

    The rest of the columns can simply be subqueries driven by your base table:

    Total count:

    SELECT COUNT(*)
    FROM   productWarranty
    WHERE  product = 'Hammer'
    

    Total valid warranties:

    SELECT COUNT(*)
    FROM   productWarranty
    WHERE  product = 'Hammer'
       AND purchased >= 
    

    Total expired warranties:

    SELECT COUNT(*)
    FROM   productWarranty
    WHERE  product = 'Hammer'
       AND purchased < 
    

    Last purchase date:

    SELECT MAX( purchased )
    FROM   productWarranty
    WHERE  product = 'Hammer'
    

    Now to combine all of these into a single query:

    SELECT  Base.product
        ,   (
                SELECT COUNT(*)
                FROM   productWarranty
                WHERE  product = Base.product
            ) AS TotalCount
        ,   (
                SELECT COUNT(*)
                FROM   productWarranty
                WHERE  product = Base.product
                   AND date_add(from_unixtime(purchased), INTERVAL 5 YEAR) >= CURDATE()
            ) AS ValidWarrantyCount
        ,   (    
                SELECT COUNT(*)
                FROM   productWarranty
                WHERE  product = Base.product
                   AND date_add(from_unixtime(purchased), INTERVAL 5 YEAR) < CURDATE()
            ) AS ExpiredWarrantyCount
        ,   (
                SELECT MAX( purchased )
                FROM   productWarranty
                WHERE  product = Base.product
            ) AS LastPurchased
    FROM    (
                SELECT DISTINCT product
                FROM   productWarranty
            ) AS Base
    

提交回复
热议问题