Obtiene columnas duplicadas porque, tal como las tiene, está consultando desde T1 Y T2. Entonces, a menos que diga explícitamente que me muestre solo T1.*, tomará columnas de AMBAS referencias de alias de tabla.
Dado que su consulta está haciendo un OR en las fechas, es probable que también obtenga un resultado cartesiano.
Ahora que conoce la estructura de su tabla, pero podría ser mejor con una consulta explícita como...
SELECT
t1.day,
t2.day as OtherDay,
t1.quality,
t1.anotherColumn,
t2.OtherAnotherColumn,
t1.thirdColumn,
t2.OtherThirdColumn
FROM
my_table t1
join my_table t2
on t1.quality = t2.quality
AND t2.day = '2015-01-09'
where
t1.day = '2015-01-08'
Tenga un índice en su "mi_tabla" basado en (día, calidad) para optimizar la consulta. Y puede seguir agregando en pares, las columnas que está tratando de comparar entre el día 1 y el día 2. T1 solo devolverá aquellos asociados con el primer día, y el alias T2 solo se mostrará para entradas coincidentes para la segunda fecha.
Ahora, si solo hay entradas en el lado T1 sin la entrada T2 correspondiente para la calidad y la fecha en cuestión, pero aún desea verlas, simplemente cambie JOIN a LEFT JOIN.