Godzina() wydaje się, że byłaby to użyteczna funkcja do tego, ponieważ patrzysz tylko na jeden dzień. Być może coś takiego zadziałałoby dla Ciebie:
SELECT * FROM
(SELECT HOUR(time) hour, avg(ph) AS avg_ph
FROM ph
WHERE time >= NOW() - INTERVAL 1 DAY
GROUP BY hour) p
JOIN
(SELECT HOUR(time) hour, avg(temperature) AS avg_temp
FROM temperature1
WHERE time >= NOW() - INTERVAL 1 DAY
GROUP BY hour) t ON t.hour = p.hour
JOIN
(SELECT HOUR(time) hour, avg(solids) AS avg_solids
FROM solids
WHERE time >= NOW() - INTERVAL 1 DAY
GROUP BY hour) s ON s.hour = p.hour;
Ponieważ używa sprzężeń wewnętrznych, zakładam, że w każdej tabeli zawsze będzie co najmniej jeden rekord na godzinę, ale wydaje się to rozsądne założenie.