Forum Webscript.Ru

Общие => Базы данных => Тема начата: Berkut от 06 Декабря 2004, 11:51:13

Название: запрос
Отправлено: Berkut от 06 Декабря 2004, 11:51:13
есть таблица

visits (
  id int(11) NOT NULL auto_increment,
  partner_id int(11) default NULL,
  long_ip bigint(20) NOT NULL default \'0\',
  time int(10) unsigned NOT NULL default \'0\',
  referer varchar(255) NOT NULL default \'\',
  user_agent varchar(255) NOT NULL default \'\',
  full_country varchar(100) NOT NULL default \'\',
  unique tinyint(1) NOT NULL default \'0\',
  PRIMARY KEY  (id)

можно-ли подсчитать кол-во полей с определённым partner_id за время между определённым сроком с шагом в сутки? т.е. примерно следующее, но одним запросом:

for ($time = time(); $time > time() - 3600*24*30;$time-=3600*24) {
    $begin = $time - 3600*24;
    $res = mysql_query("SELECT COUNT(*) FROM visits WHERE partner_id=$id AND time BETWEEN $begin AND $time");
}
Название: запрос
Отправлено: Макс от 06 Декабря 2004, 15:46:03
Попробуй так :
$from = time() - 3600*24*30;

SELECT COUNT(*) , FROM_UNIXTIME(time, \'%Y-%m-%d\') as my_date
FROM visits
WHERE
partner_id = $id AND time BETWEEN $from AND $time
GROUP BY my_date
Название: запрос
Отправлено: Berkut от 06 Декабря 2004, 16:31:00
Макс ОГРОМНОЕ СПАСИБО! С меня ящик пива если появишся в Самаре
Название: запрос
Отправлено: Berkut от 07 Декабря 2004, 00:18:55
вопрос в догонку:
SELECT COUNT( * ) , FROM_UNIXTIME( xaffilate_visits.time, \'%d\' )
as my_date, sum(
if (
xaffilate_visits.country_code = \'ru\', 1, 0
) )
as from_rus, xaffilate_stat.today
FROM xaffilate_visits, xaffilate_stat
WHERE xaffilate_visits.partner_id = 1 AND xaffilate_visits.time > 1000
and FROM_UNIXTIME( xaffilate_visits.time, \'%d\' ) = FROM_UNIXTIME( xaffilate_stat.time, \'%d\' )
GROUP BY my_date
ORDER BY xaffilate_stat.time

работает, но если в \'WHERE\' поставить не
FROM_UNIXTIME( xaffilate_visits.time, \'%d\' ) = FROM_UNIXTIME( xaffilate_stat.time, \'%d\' )
а
my_date=my_td - пишет неизвестный столбец my_date, хотя в
GROUP BY - "my_date" работает?! и хотелось-бы узнать, не слишком-ли страшный запрос?
Название: запрос
Отправлено: Phoinix от 07 Декабря 2004, 04:32:44
Berkut

Псевдонимы можно использовать только в условиях HAVING и при сортировке.
Название: запрос
Отправлено: Berkut от 08 Декабря 2004, 04:24:14
как подсчитать в одном запросе кол-во выбранных строк и вывести сами строки подходящие по условию?
типа:
SELECT * FROM table WHERE col = \'smth\'
при этом вывести кол-во выбранных этим запросом строк?
Название: запрос
Отправлено: Phoinix от 08 Декабря 2004, 15:13:30
Berkut
Цитировать
как подсчитать в одном запросе кол-во выбранных строк и вывести сами строки подходящие по условию?


IMHO в SELECT данный подсчет производить глупо. Количество строк можно получить и после выполнения запроса, как один из параметров результата.

Те же:
mysql_num_rows - для PHP;
rows() - для Perl (DBI).
Название: запрос
Отправлено: Berkut от 08 Декабря 2004, 15:53:09
я немного тут ошибся, SELECT * FROM table WHERE col = \'smth\' LIMIT $start, $limit
как подсчитать  кол-во строк, как подсчитать кол-во строк выборки, так если-бы она происходила без LIMIT
Название: запрос
Отправлено: Phoinix от 08 Декабря 2004, 16:15:36
Berkut

Честно говоря, как-то звучала фраза, что лучше сделать 2 простых запроса чем 1 сложный...

SELECT t2.*, COUNT(t1.id) AS number
FROM my_table AS t1, my_table AS t2
WHERE t1.col = \'smth\' AND t2.col = \'smth\'
GROUP BY t2.id, t1.col
LIMIT 10,20

id - соответсвенно уникальный идентификатор...
Название: запрос
Отправлено: hanslinger от 08 Декабря 2004, 16:18:19
SELECT *,COUNT(*) ...
Название: запрос
Отправлено: Phoinix от 08 Декабря 2004, 16:23:51
hanslinger

Шутник, однако... у меня чуть истерика не началась, думал, уже 2 + 2 без логарифмов сложить не могу... :) :) :)
Название: запрос
Отправлено: hanslinger от 08 Декабря 2004, 18:44:42
А. Ну да :). Извиняюсь :).
Название: запрос
Отправлено: Berkut от 11 Декабря 2004, 21:30:51
а вот ещё вопрос назрел
есть
stat:
partner_id | day | day_amount
и
partners
id | total_amount

нужно обновить total_amount
по следующему прниципу -
total_amount=total_amount+(day_amount*someval-day_amount) where day = anotherval
т.е. выбрать day_amount, умноженное на someval для каждого partner_id, где day равен тому-то, и приплюсовать все это к total_amount cоответственно для каждого id
подскажите как сделать?я вообще в тупике, из доки я понял что с update вообще нельзя использовать ни join,  union