Как мне исправить этот запрос MySQL? - PullRequest
2 голосов
/ 01 декабря 2008
SELECT 
  avg(con_hits) as avg_hits 
FROM 
  content 
WHERE 
  con_type = 1 
  AND con_posttime < $twelve_hrs_ago 
  AND con_refresh = 0 
ORDER BY 
  con_posttime DESC 
LIMIT 100

Я бы хотел перейти к первой записи, которая была опубликована не менее 12 часов назад (она обозначена переменной $twelve_hrs_ago с подходящей временной меткой), и взять среднее значение столбца con_hits для следующей 100 записей. В моем примере он игнорирует LIMIT и принимает среднее значение для каждой записи в таблице.

Есть ли способ обойти это?

Ответы [ 2 ]

12 голосов
/ 01 декабря 2008

LIMIT применяется к набору результатов после вычисления AVG. Вы можете делать то, что вы хотите, с помощью подвыбора:

SELECT avg(con_hits) as avg_hits
FROM (
  SELECT con_hits
  FROM content
  WHERE
    con_type = 1
    AND con_posttime < $twelve_hrs_ago
    AND con_refresh = 0
  ORDER BY con_posttime DESC
  LIMIT 100
) x;

Вы также можете использовать базу данных для расчета смещения времени. Заменить $twelve_hrs_ago выше на:

date_add(now(), interval -12 hour)
1 голос
/ 01 декабря 2008

А как же:


SELECT avg(con_hits) as avg_hits FROM (
    SELECT con_hits FROM content 
    WHERE con_type = 1 AND con_posttime < $twelve_hrs_ago AND con_refresh = 0
    ORDER BY con_posttime DESC
    LIMIT 100
    ) 

Mysql поддерживает подзапросы, так что это может сделать это для вас.

http://dev.mysql.com/doc/refman/5.0/en/subqueries.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...