Запрос выдает странные данные

clevel

Новичок
Запрос выдает странные данные

Таблица statistic:
---------------------------------------------------------------
owner(int)|page(int)|when(timestamp(14))|execute(decimal(4,2))|
---------------------------------------------------------------
2 | 10 | 20020912032434 | 0.3234 |
---------------------------------------------------------------
2 | 11 | 20020912032435 | 0.5 |
---------------------------------------------------------------
2 | 10 | 20020912032635 | 0.44 |
---------------------------------------------------------------

запрос к таблице statistic:
SELECT
DATE_FORMAT(statistic.when,'%Y%m'),
COUNT(copy.page), //выдает КВАДРАТ необходимых данных
Min(copy.execute)/2+Max(copy.execute)/2
FROM statistic,statistic copy
WHERE statistic.owner=2
AND copy.owner=statistic.owner
AND DATE_FORMAT(copy.when,'%Y%m')=DATE_FORMAT(statistic.when,'%Y%m')
GROUP BY DATE_FORMAT(statistic.when, '%Y%m')
ORDER BY statistic.when

Таблица cookies:
-----------------------------------------
owner(int)|page(int)|when(timestamp(14))|
-----------------------------------------
2 | 10 | 20020912032434 |
-----------------------------------------
2 | 11 | 20020912032435 |
-----------------------------------------
2 | 10 | 20020912032635 |
-----------------------------------------

Запрос к таблицам cookies,statistic:
SELECT
DATE_FORMAT(cookies.when,'%Y%m'),
cookies.page,
COUNT(cookies.page) //выдает значение, увеличеннное в 91 раз
FROM statistic,cookies
WHERE statistic.owner=2
AND cookies.owner=statistic.owner
AND DATE_FORMAT(cookies.when,%Y%m)=DATE_FORMAT(statistic.when,'%Y%m')
GROUP BY DATE_FORMAT(statistic.when, '%Y%m'),cookies.page
ORDER BY statistic.when

Вопросы:
1.Почему в первом запросе возвращает одно из значений, возведенное во вторую степень, а во втором случае - умноженную на 91. В чем ошибка, приводящая к искажению результатов?
2.Можно ли заменить DATE_FORMAT(...) в теле WHERE как-нибудь, так как в SELECT такая конструкция уже имеется. Пытался сделать так: SELECT DATE_FRMAT(..) AS num и далее использовать num, однако выдает ошибку...
 

chira

Новичок
Что ты в итоге хочешь получить?

то что у тебя получились квадраты и *91 - это случайные значения
можешь добавить еще записей в таблицы и обнаружишь совсем другие значения множителей и квадратов , кубов ....
 

clevel

Новичок
то что у тебя получились квадраты и *91 - это случайные значения
можешь добавить еще записей в таблицы и обнаружишь совсем другие значения множителей и квадратов , кубов ....
Мне надо "чистые значения", откуда дополнительные примеси берутся, никак понять не могу... поэтому и привел структцру таблиц с запросами, может я где-то глючу...
 

Апельсин

Оранжевое создание
clevel в первом запросе у тебя идет GROUP BY только по DATE_FORMAT(statistic.when, '%Y%m')

а во втором запросе по DATE_FORMAT(statistic.when, '%Y%m') и cookies.page

вот и смотри что к чему.
 

chira

Новичок
Убери из запросов GROUP BY и посмотри из каких записей отбираются MIN MAX COUNT

в первом SQL у тебя по условию соединяются все записи (каждый с каждым) вот и получается квадрат
 

chira

Новичок
попробуй такой select для 1 SQL
SELECT
DATE_FORMAT(statistic.when,'%Y%m'),
COUNT(statistic.page),
Min(statistic.execute)/2+Max(statistic.execute)/2
FROM statistic
WHERE statistic.owner=2
GROUP BY 1
ORDER BY 1
 

clevel

Новичок
Убери из запросов GROUP BY и посмотри из каких записей отбираются MIN MAX COUNT

в первом SQL у тебя по условию соединяются все записи (каждый с каждым) вот и получается квадрат
не совсем понял..
передо мной стоит задача: отобрать все уникальные месяцы с годами и по каждому найденному уникальному значению выбрать количество page. Group by делает выборку уникальных дат, а через таблицу copy я делаю count(page) для каждого месяца года...
1.Как избежать соединения записей? (чтобы от квадрата избавиться)
2.Если я уберу group by. все рассыпиться...
 

clevel

Новичок
SELECT
DATE_FORMAT(statistic.when,'%Y%m'),
COUNT(statistic.page),
Min(statistic.execute)/2+Max(statistic.execute)/2
FROM statistic
WHERE statistic.owner=2
GROUP BY 1
ORDER BY 1
Получился первый запрос... класс!!! только что интересно... вроде одна таблица, но если убрать statistic из определений полей, то запрос выдает ошибку...
 

clevel

Новичок
сделал по аналогии второй запрос, все заработало, спасибо...
такой вопрос: как сделать запрос, который делает выборку из таблицы statistic (см. начало) уникальных page, если разница по времени между ближайшими записями when больше 10 мин
(как я думаю, две ближайшие записи не обязательно должны идти одна за другой по времени)
 

Апельсин

Оранжевое создание
Получился первый запрос... класс!!! только что интересно... вроде одна таблица, но если убрать statistic из определений полей, то запрос выдает ошибку...
потому как использовать зарезервированные слова (when) в качестве имен - плохой тон.
 

clevel

Новичок
потому как использовать зарезервированные слова (when) в качестве имен - плохой тон.
а если я буду выдумывать непонятные слова, которые не объясняют что-зачем, я запутаюсь в программе...
 

su1d

Старожил PHPClubа
а ты добавляй префикс к полям:

t_when (time)
i_id (int)
s_page (string)

и в РНР коде будет всё более читабельно, и конфликтов с зарезервированными словами не получишь
 
Сверху