I have the following table:
+-------------+--------------+
| product | purchased |
+-------------+--------------+
| Hammer | |
|
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