Выбрать и сложить одним запросом

usascha

Новичок
Выбрать и сложить одним запросом

Всем привет.
Есть запрос
PHP:
SELECT book_title, data, views, SUM(views) 
FROM book 
GROUP BY book_title
ORDER BY views DESC, book_title ASC, data DESC
LIMIT 0,60
Сейчас SUM(views) не делает то, что надо: просто повторяет значение views.

Задумка такая: выбираются значения views и складываются.
Можно ли это реализовать в mysql запросе или только в php?
 

Necromant

Новичок
Re: Выбрать и сложить одним запросом

Автор оригинала: usascha
Сейчас SUM(views) не делает то, что надо: просто повторяет значение views.

Задумка такая: выбираются значения views и складываются.
Можно ли это реализовать в mysql запросе или только в php?
Т.е. складываются , следущее , сумма предидущего ?
1 => views1
2 => views1+views2
...
n => views(n-1) + views(n)

или

PHP:
SELECT book_title, data, SUM(views)  as sum_view
FROM book 
GROUP BY book_title
и см, поле sum_views
 

antson

Новичок
Партнер клуба
usascha
1) в части перечисления результирующих полей запроса допустимы поля по которым идет group by , а также агрегатные функции типа sum(),min(),max(),avg()

в этом плане два поля data,views тогда должны идти в group by тоже.

2) sum(views) as summa_prosmotrov
вычисляемым полям лучше давать осмысленные имена (сугубое имхо)


3) мускул прощает ошибку по п.1

4) указание views для твоей задачи ошибочно тебе же нужна сумма, а не повторы строк, что у тебя и происходит

поэтому попробуй
SELECT book_title, data, SUM(views) as sum_view
FROM book
GROUP BY book_title ,data
ORDER BY sum_view DESC, book_title ASC, data DESC
LIMIT 0,60

5) если в течении дня у тебя только одна строчка то группировать по дате не имеет смысла
 

usascha

Новичок
Necromant, этот вариант я попробовал первым делом. Но получилось следующее:
книга 1 - views:3 allviews: 3
книга 2 - views:4 allviews: 4
книга 3 - views:21 allviews: 21


antson, Вы предлагаете то же самое. Ответ тот же.

Реально ли сделать запрос с помощью union или это из другой оперы?
 

antson

Новичок
Партнер клуба
usascha
тебе нужно нарастающие суммы по датам ?
т.е.
дата хиты сумма
1 числа 10 10
2 числа 5 15
3 числа 20 35

тогда нужно соединять таблицу саму с собой
где совпадают id и даты не провосходят

select a.id,a.data,a.hit,sum(b.hit) from table a,table b
where a.id=b.id and a.date>=b.date group by a.id,a.data,a.hit
order by a.id,a.date

это требовалось ?
 

usascha

Новичок
antson, в Вашем примере есть условие на дату. Мне это вообще неважно (да и никак не учитывается).
Смысл: есть список книг. Каждую книгу просматривают какое-то количество раз. Мне надо сложить эти разы по всем книгам.

Как я уже приводил пример выше:
книга 1 - views:3
книга 2 - views:4
книга 3 - views:21

мне надо получить число 3+4+21=28
 

antson

Новичок
Партнер клуба
ну такое простое и в голову не приходило :)

тебе нужно просто сумму всех просмотров ?
select sum(views) as summa from table

Найди время прочитать http://www.sql-ex.ru/help/select4.php#agregate

агрегатные функции и group by
по ссылке ман ориентированный на MS , но написан очень доходчево и эта часть относиться к ANSI SQL
так, что подойдет и MySQL
 

usascha

Новичок
Спасибо, ссылку прочитал. Там, правда, все на вложенных запросах. В общем у меня ничего не получилось на mysql. Сделал на php:
PHP:
$sql = mysql_query("SELECT book_title, data, views
							FROM book 
							GROUP BY book_title
							ORDER BY views DESC, book_title ASC, data DESC
							LIMIT 0,60");
echo "<ol>";
$v=0;
while ($row=mysql_fetch_array($sql)) {
	$book_views[$v] = $row['views'];
	if (!isset($allviews)) $allviews=0;
	$allviews = $allviews+$book_views[$v];
$v++;
}
 

antson

Новичок
Партнер клуба
огласи чтоты хочешь получить в итоге, как пытаешься сделать мы уже видим.

если сумма тебе нужна для формирования считай ее в цикле вывода строк.


зачем это в цикле
if (!isset($allviews)) $allviews=0;

не проще перед циклом ей присвоить 0 ?

у тебя $v в цикле не увеличивается $book_views[$v]
получается гоняешь данные из массива row в нулевую ячейку
book_views и потом только приплюсоваешь к сумме.
Зачем из москвы в питер через сахалин ездишь ?
 

usascha

Новичок
насчет allviews согласен - проще присвоить 0.
Насчет $book_views[$v] я не понял. Разве v++ не увеличивает? Как тогда правильно?

Результат есть - код работает. Смысл его в том, чтобы понять происходит ли обращение к нашим книгам: проще видеть один счетчик, чем помнить значение 60 книг. Я вижу счетчик на каждую из этих 60 книг и общий. Смотря на общий, становится понятно, что обращения есть.
 

antson

Новичок
Партнер клуба
usascha
извини. пропустил строку. когда читал.
она без отступа была.
 
Сверху