skip to Main Content

I have one query which return correct results for the parameters that are there but not what the goal is.

There are two columns month and year. What I want is when I choose from dropdowns:

4/2020 to 12/2022 to return everything after month 4 of 2020 till month 12 of 2022. Currently, when I choose 4/2020 to 12/2022 it returns everything but removes months up to 4th from each year.

Example when the query is 1/2020 to 12/2022:

country_id    rate    month    year    value 
160           1.60    3        2020    1.4
160           1.30    9        2020    1.4
160           1.2983  3        2021    1.4
160           NULL    3        2022    2
160           NULL    6        2022    1.4 

When I run the query 4/2020 to 12/2022 the result is

country_id    rate    month    year    value 
160           1.30    9        2020    1.4
160           NULL    6        2022    1.4 

but it must be

country_id    rate    month    year    value 
160           1.30    9        2020    1.4
160           1.2983  3        2021    1.4
160           NULL    3        2022    2
160           NULL    6        2022    1.4 

Here is the query which shows all the results

SELECT r.country_id, r.rate as rate, r.month, d.country_id, d.year, d.month as value 
FROM `data_prod` d 
INNER JOIN monthly_data r ON r.country_id = d.country_id AND r.year=d.year AND r.month=d.month 
WHERE d.country_id IN (160) 
AND d.year BETWEEN 2020 AND 2022 
AND r.year BETWEEN 2020 AND 2022 
AND d.month BETWEEN 1 AND 12 
ORDER BY d.year, d.month

The query which removes up to 4th month (in this case) from each year

SELECT r.country_id, r.rate as rate, r.month, d.country_id, d.year, d.month as value 
FROM `data_prod` d 
INNER JOIN monthly_data r ON r.country_id = d.country_id AND r.year=d.year AND r.month=d.month 
WHERE d.country_id IN (160) 
AND d.year BETWEEN 2020 AND 2022 
AND r.year BETWEEN 2020 AND 2022 
AND d.month BETWEEN 4 AND 12 
ORDER BY d.year, d.month

Here is the php part

$countryIds = $countries;
$month_clause = "AND d.month BETWEEN $selectedStartMonth AND $selectedEndMonth";
        
$query = "SELECT r.country_id, r.rate as rate, r.month, d.country_id, d.year, d.month as value
      FROM `data_prod` d
      INNER JOIN monthly_data r ON r.country_id = d.country_id AND r.year=d.year AND r.month=d.month 
      WHERE d.country_id IN (".implode(",",$countryIds).") 
      AND d.year BETWEEN $periodStart AND $periodEnd
      AND r.year BETWEEN $periodStart AND $periodEnd
      $month_clause
      ORDER BY d.year, d.month";

Can anyone help a bit here?

2

Answers


  1. I would store the month and year as a datetime data type in your table and then give then a value as the first day of the desired month. That would make your code a bit slicker and you would have a smaller table and less data to search etc. Also it would be easier on your query.

    Login or Signup to reply.
  2. Rewrite the SQL query to:

    SELECT r.country_id, r.rate as rate, r.month, d.country_id, d.year, d.month as value 
    FROM `data_prod` d 
    INNER JOIN monthly_data r ON r.country_id = d.country_id 
                             AND r.year=d.year AND r.month=d.month 
    WHERE d.country_id IN (160) 
    AND ((d.year=2020 and d.month>=4) OR
         (d.year>2020 and d.year<2022) OR
         (d.year=2022 and d.month<=12))
    ORDER BY d.year, d.month
    

    Or you could use this answer, and write:

    SELECT r.country_id, r.rate as rate, r.month, d.country_id, d.year, d.month as value 
    FROM `data_prod` d 
    INNER JOIN monthly_data r ON r.country_id = d.country_id 
                             AND r.year=d.year AND r.month=d.month 
    WHERE d.country_id IN (160) 
    and date(concat_ws('-',d.year,d.month,1)) between '2020-04-01' and '2022-12-01'
    ORDER BY d.year, d.month
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search