Замена вложенного запроса JOIN'ами

Tofik

Новичок
Замена вложенного запроса JOIN'ами

есть запрос вида:

SELECT (SELECT AVG(mark) FROM rating WHERE cam_id = c.id AND type = 'Q') AS Qaverage, (SELECT AVG(mark) FROM rating WHERE cam_id = c.id AND type = 'F') AS Faverage, c.* FROM cams AS c WHERE 1

В документации по mysql написано, что 99% запросов можно заменить JOIN'ами. Каким образом можно заменит такой запрос?
 

alpine

Новичок
Tofik
Примерно так:
[sql]
LOCK TABLES rating READ, cams AS c READ;

CREATE TEMPORARY TABLE tmp1
SELECT cam_id, AVG(mark) AS Qaverage FROM rating WHERE `type` = 'Q' GROUP BY cam_id;

CREATE TEMPORARY TABLE tmp2
SELECT cam_id, AVG(mark) AS Faverage FROM rating WHERE `type` = 'F' GROUP BY cam_id;

SELECT t1.Qaverage, t2.Faverage, c.* FROM cams AS c
LEFT JOIN tmp1 as t1 ON(c.id=t1.cam_id)
LEFT JOIN tmp2 as t2 ON(c.id=t2.cam_id);

DROP TEMPORARY TABLE tmp1, tmp2;

UNLOCK TABLES;
[/sql]
 

astellar

Новичок
Re: Замена вложенного запроса JOIN'ами

В документации по mysql написано, что 99% запросов можно заменить JOIN'ами. Каким образом можно заменит такой запрос?
Если таблица rating будет большой, то любой из вариантов будет сильно тормозить. Я бы сделал два дополнительных поля в таблице cams и пересчитывал их например раз в сутки по крону. В этом случае нет необходимости даже в JION'e.
 

chira

Новичок
вместо двух запросов для подсчёта AVG можно сделать один:
Код:
CREATE TEMPORARY TABLE tmp1 AS
SELECT cam_id
  , AVG( IF(`type` = 'Q',mark,NULL )) AS Qaverage
  , AVG( IF(`type` = 'T',mark,NULL )) AS Taverage
FROM rating
GROUP BY cam_id
 
Сверху