Vous obtenez des colonnes en double car, comme vous l'avez, vous interrogez à partir de T1 ET T2. Donc, à moins que vous ne disiez explicitement de ne me montrer que T1.*, il récupérera les colonnes des DEUX références d'alias de table.
Puisque votre requête fait un OU sur les dates, vous obtiendrez probablement aussi un résultat cartésien.
Connaissant maintenant la structure de votre table, mais vous pourriez être mieux avec une requête explicite quelque chose comme...
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'
Ayez un index sur votre "ma_table" basé sur (jour, qualité) pour optimiser la requête. Et vous pouvez simplement continuer à ajouter par paires, les colonnes que vous essayez de comparer entre jour1 et jour2. T1 ne renverra que ceux associés au premier jour, et l'alias T2 ne s'affichera que pour les entrées correspondantes pour la deuxième date.
Maintenant, s'il n'y a que des entrées du côté T1 sans entrée T2 correspondante pour la qualité et la date en question, mais que vous voulez toujours les voir, changez simplement le JOIN en LEFT JOIN.