Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1 2
Дoбрый.
Читаю и ищу уже второй день, к сожалению безрезультатно. На MySQL сделал не много и несложно, но есть желание разобраться в теме глубже.
Глобально необходимо сортировать артикулы по количеству кликов на них за последние 3 месяца.
Поделил задачу на следующие шаги:
1. Реализовать сбор статистики кликов по каждому артикулу в день.
Как я себе это представляю, логичнее создать отдельную таблицу с полями: id, data, 1, 2, 3, 4, 5, 6, 7…
Где цифры- id артиклей. Их будет не более 400, пока 300
Каждая новая строка -это новая дата.
Средствами PHP будут считаться клики и определяться есть ли в таблице сегоднешняя дата. До этого момента пока всё ясно.
Проблема 1: как реализовать добавление новой колонки в таблицу и обозвать это поле так же как и id арптикула.
т.е. это работает... тут всё понятно:
<?php
mysql_query("
Неактивен
Очень сложная структура таблицы, попробуйте хранить клики в виде «таблички-лога»
CREATE TABLE clickstat (id INT NOT NULL, ts TIMESTAMP, PRIMARY KEY (ts, id));
Как чуть более сложный вариант (но куда более экономный по ресурсам):
CREATE TABLE clickstat (id INT NOT NULL, ts DATE NOT NULL, cnt INT NOT NULL, PRIMARY KEY (ts, id));
В первом случае на каждый клик добавляется дополнительная строчка, во втором случае —
добавляется только в случае отсутствия такого же артикула за тот же день:
INSERT INTO clickstat VALUES ($article_id, CURRENT_DATE(), 1) ON DUPLICATE KEY UPDATE cnt = cnt + 1;
Для таких табличек окончательные группировки пишутся прямо «как думается»
SELECT id, SUM(cnt)
FROM clickstat
WHERE ts > DATE() - INTERVAL 3 MONTH
GROUP BY 1;
Неактивен
Только вместо DATE() следует писать DATE(now())
Doxtor написал:
Дoбрый.
Читаю и ищу уже второй день, к сожалению безрезультатно. На MySQL сделал не много и несложно, но есть желание разобраться в теме глубже.
В качестве разобраться в теме касательно первого вопроса. Синтаксис SQL не позволяет использовать переменные в указанном вами запросе. Имя столбца должно быть константой. Для преодоления этого ограничения используют подготовленные выражения. См. обсуждение http://sqlinfo.ru/forum/viewtopic.php?id=363
Неактивен
Дада, я имел в виду CURRENT_DATE(), а не DATE(), конечно же. Исправил inplace.
--
По поводу переменных: там переменная подставляется из PHP, так что с точки зрения
MySQL это будет константой.
Неактивен
Спасибо.
С созданием таблицы всё понятно, взял второй вариант.
А вот это никак не хочет идти:
Отредактированно Doxtor (06.08.2009 18:42:59)
Неактивен
Спасибо.
На дату теперь не ругается, зато ругается на "ON DUPLICATE KEY UPDATE cnt = cnt + 1' at line 1 "
Неактивен
А какая у вас версия MySQL?
Неактивен
MySQL-Client-Version: 5.0.60
Может там какой запятой не хватает?
Продолжаю кликать на гугл.
Отредактированно Doxtor (06.08.2009 21:21:16)
Неактивен
Клиент — это ладно, какой версии сервер?
У меня замечательно работает. Попробуйте скопировать-и-вставить код, может, где-то опечатываетесь?
Неактивен
Был 3-й MySQL, поменял на 4.1 и всё заработало.
Т.е. Сбор статистики работает замечательно.
Подитожу(раз уж раздел для начинающих):
Для сбора статистики кликов по артикулам, статьям, заметкам и пр.
1. Создать таблицу:
Отредактированно Doxtor (07.08.2009 15:08:27)
Неактивен
Я не сдался ещё, но уже близок к тому.
Что имеем:
1-я таблица с артикулами, у артикулов есть id
2-я таблица CREATE TABLE clickstat (id INT NOT NULL, ts DATE NOT NULL, cnt INT NOT NULL, PRIMARY KEY (ts, id));
Вынуть из таб.2 сумму кликов за N месяцев и отсортировать по id меня уже научили
А хочется вынуть артикулы из таб.1 и отсортировать по сумме кликов за N месяцев из таб2.
Вот такая задача. Заранее спасибо.
Неактивен
SELECT f.id, SUM(c.cnt)
FROM firsttable f LEFT JOIN clickstat c ON f.id = c.id
WHERE c.ts > CURRENT_DATE() - INTERVAL 3 MONTH
GROUP BY 1;
Неактивен
Спасибо, проверю уже в понедельник.
Хотел просто уточнить: если первая таблица- node, а вторая- stat, то выборка выглядит так:
Неактивен
Да
Неактивен
Работает, но сортирует по GROUP BY 1, т.е. по id, а нужно по SUM( stat.cnt )
Возможно ли это?
Неактивен
ORDER BY 2 в конец выражения еще допишите Или ORDER BY 2 DESC, если
в обратном порядке.
Неактивен
Ступил, знал же, огромное спасибо. Всё работает. Ура!!!
Вот окончательный вариант с выводом и выборкой по категории, в этом случае из категории 14
Переменные $start, $num - постраничная навигация.
Остальное вроде должно быть понятно.
Отредактированно Doxtor (10.08.2009 17:59:00)
Неактивен
Можно еще немножко упростить логику, если писать
Неактивен
Спасибо за совет.
Но тут я поступлю по принципу: работет- не трогай.
Т.к. стабильностью и скоростью я пока был доволен, а 100К уников в день в обозримом будующем не ожидаем.
Или насколько Ваш вариант лучше, быстрее и т.д.?
Неактивен
Он не сильно быстрее, просто меньше вызовов, меньше дублирования кода,
легче читается
Неактивен
У меня такой глупый вопрос:
а если бот заходит на страницу, то клики всё равно прибавляются?
Если ДА, то как это можно избежать?
Напомню, речь идёт вот об этой части кода:
INSERT INTO clickstat VALUES ($article_id, CURRENT_DATE(), 1) ON DUPLICATE KEY UPDATE cnt = cnt + 1;
Заранее спасибо.
Неактивен
Избежать можно путем не прибавления кликов в случае прихода бота
Боты не отличаются ничем от людей. Разве что обычно они приходят с заголовком HTTP
User-Agent специфичным для конкретного бота. Впрочем, ничто не мешает людям приходить
с такими же заголовками, или, наоборот, ботам приходить с людскими.
Отлавливание ботов — процесс увлекательный и интересный
Неактивен
Знаю что с PHP не сюда, но чтобы закончить тему и другим будет может полезно:
вот что-то типа этого?
Неактивен
Ну, только сравнивать надо не с пустой строкой. Например, мой браузер выписывает туда вот такое:
Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.13) Gecko/2009080315 Ubuntu/9.04 (jaunty) Firefox/3.0.13
А я на бота не очень похож
P.S. И strstr тут как-то странно используется, попробуйте preg_match какой-нибудь.
Неактивен
М-да-а-а.
Походу кроме того что перечислить "все" боты выхода нет!?
Что получилось смотри ниже...список постоянно пополняется...
Или есть более элегантный вариант?
Про preg_match не понял.
Отредактированно Doxtor (21.08.2009 20:49:03)
Неактивен
Страниц: 1 2