Get minimum value row based on column values
Keep in mind that if CURDATE() doesn't fit any range of dates you'll get no rows.




select   id, 
         min(price) price, 
         special_price, 
         special_from_date,
         special_to_date
from     prices
where    special_price is not null
and      special_from_date is not null
and      special_to_date is not null
and      (curdate() &gt;= special_from_date
          and
          curdate() &lt;= special_to_date)
group by id



  id |    price | special_price | special_from_date | special_to_date
---: | -------: | ------------: | :---------------- | :--------------
2648 | 299.0000 |       85.0000 | 2017-12-29        | 2018-02-28     



dbfiddle here