powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите с запросом
31 сообщений из 31, показаны все 2 страниц
Помогите с запросом
    #38720892
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне нужно вывести среднюю сумму в месяц за последний месяц. Как будет выглядеть sql запрос? Спасибо
...
Рейтинг: 0 / 0
Помогите с запросом
    #38720911
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTКак будет выглядеть sql запрос?как одна или несколько строк латиницы
да, чуть не забыл, там непременно будут слова select, avg, from, where, и, возможно, group by
...
Рейтинг: 0 / 0
Помогите с запросом
    #38720920
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ок, тогда так:
вот собственно мои данные:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
id  curr       price        dateStart              driver_id
1  RUB	215.00  2014-07-14 10:34:10     2 
2  RUB	150.00  2014-07-14 14:23:15     2
3  RUB	150.00  2014-07-14 15:58:34	     3	
4  RUB	150.00  2014-07-14 16:20:18     3		
5  RUB	200.00  2014-07-14 17:40:15	     3			
6  RUB	200.00  2014-08-14 09:05:03	     4	
7  RUB	215.00  2014-08-14 11:15:12     2
8  RUB	200.00  2014-08-14 18:58:18     2
нужно получить среднюю сумму price в месяц, за последний месяц по конкретному driver_id
или вам предоставить запросы для создания таблицы и заполнения данных?
...
Рейтинг: 0 / 0
Помогите с запросом
    #38721024
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уже 4 года со скулем работаете (пусть даже не постоянно), а до сих пор не поняли, что язык-то простой, почти что разговорный, и запрос вы, собственно, уже сформулировали, осталось его на английский перевести :)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
-- получить 
select
-- среднюю сумму price
avg(price)
/*откуда вообще брать данные*/
from таблица
-- за последний месяц
where datestart>date_add(curdate(),interval ...) /*ну тут-то догадаетесь, что написать?*/
-- по конкретному driver_id
 and driver_id=:myid
...
Рейтинг: 0 / 0
Помогите с запросом
    #38721037
belkaU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, чтобы не плодить тем, помогите, пожалуйста в этой.

Выбираю все значения поля, для которого верно условие. Только условие толком описать на языке запроса не могу ибо нуб/первый раз делаю запрос.

id index
1 8::100||28::50
2 9::100||8::50
3 81::100||28::50

Придумал только это:
SELECT id FROM site_content WHERE index LIKE '8%n';

но не годится, так как во второй строке есть 8 после|| и она тоже должна попасть в выборку.
а в третьей есть 81, которое не должно попасть в выборку.

В общем суть вопроса, как описать, что ищется именно то, что до ::, и продолжается поиск в строке если есть ||
...
Рейтинг: 0 / 0
Помогите с запросом
    #38721044
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то у вас отдельный вопрос, и лучше бы под него было создать отдельную тему имхо. Перефразирую вопрос - надо найти строки, которые:
-либо начинаются с "8::"
-либо в них есть подстрока "||8::"
Так?
...
Рейтинг: 0 / 0
Помогите с запросом
    #38721070
belkaU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir,
кратко и гениально точно
...
Рейтинг: 0 / 0
Помогите с запросом
    #38721076
belkaU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Получается, я слеп, глуп и достаточно запроса
SELECT id FROM site_content WHERE index LIKE '%8::%';
...
Рейтинг: 0 / 0
Помогите с запросом
    #38721078
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читайте про строковые функции .
Первое условие проверяется с помощью left, второе с помощью instr.
...
Рейтинг: 0 / 0
Помогите с запросом
    #38721082
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
belkaU,

неа :) через это условие спокойно пройдут строки "11118::" и "123::456||218::123"
...
Рейтинг: 0 / 0
Помогите с запросом
    #38721088
belkaU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, чьорт побьери ) а я уж думал гениально упростился
...
Рейтинг: 0 / 0
Помогите с запросом
    #38721091
belkaU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а два запроса
SELECT id FROM site_content WHERE index LIKE '8::%'; и SELECT id FROM site_content WHERE index LIKE '||8::%'; не будет ли более простым решением? Или это костыли? ))
...
Рейтинг: 0 / 0
Помогите с запросом
    #38721094
belkaU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
т.е. SELECT id FROM site_content WHERE index LIKE '8::%'; SELECT id FROM site_content WHERE index LIKE '%||8::%';
...
Рейтинг: 0 / 0
Помогите с запросом
    #38721126
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
belkaU, можно и так. А некоторые седобородые гуру в таких случаях и вовсе пишут оба условия через OR. Попробуйте, вдруг и у вас получится? :)
...
Рейтинг: 0 / 0
Помогите с запросом
    #38721284
belkaU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Получилось с таким запросом SELECT id FROM modx_site_tmplvar_contentvalues WHERE value LIKE '8::%' AND tmplvarid='11' OR value LIKE '%||8::%' AND tmplvarid='11'


Теперь проблема с выводом через PHP.
Может подскажете?

Мой код возвращает полный путь, а нужны только value.

<?php
$res = $modx->db->query( "SELECT contentid FROM modx_site_tmplvar_contentvalues WHERE value LIKE '8::%' AND tmplvarid='11' OR value LIKE '%||8::%' AND tmplvarid='11'" );
while($row = $modx->db->getRow($res))

print_r($row);

?>
...
Рейтинг: 0 / 0
Помогите с запросом
    #38721326
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
belkaUМой код возвращает полный путь, а нужны только value.если вы выбираете contentid, то он и будет выводиться
хотите выводить value - выбирайте value
...
Рейтинг: 0 / 0
Помогите с запросом
    #38721985
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirУже 4 года со скулем работаете (пусть даже не постоянно), а до сих пор не поняли, что язык-то простой, почти что разговорный, и запрос вы, собственно, уже сформулировали, осталось его на английский перевести :)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
-- получить 
select
-- среднюю сумму price
avg(price)
/*откуда вообще брать данные*/
from таблица
-- за последний месяц
where datestart>date_add(curdate(),interval ...) /*ну тут-то догадаетесь, что написать?*/
-- по конкретному driver_id
 and driver_id=:myid


Делаю так:
Код: sql
1.
2.
3.
4.
SELECT avg(price) FROM mission
where mission.dateStart > LAST_DAY( DATE_SUB( CURDATE( ) , INTERVAL 2 MONTH ) ) + INTERVAL 1 DAY 
AND  mission.dateStart < DATE_ADD( LAST_DAY( CURDATE( ) - INTERVAL 1 MONTH ) , INTERVAL 1 DAY ) 
and driver_id=:myid


Данный запрос выдает среднюю сумму за последний месяц(т.е. предыдущий, или текущий? что считается последним месяцем?), а как сделать не просто среднюю сумму, а среднюю сумму в месяц за последний месяц.
Прошу помочь и спасибо)
...
Рейтинг: 0 / 0
Помогите с запросом
    #38722144
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще мне не понятно следующее: Вернуть средний чек вообще. Что туда должно входить?
...
Рейтинг: 0 / 0
Помогите с запросом
    #38722149
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTа как сделать не просто среднюю сумму, а среднюю сумму в месяц за последний месяц.Что такое "средняя сумма в месяц за последний месяц"? Чем она отличается от просто "средней суммы за последний месяц"?
JulTИ еще мне не понятно следующее: Вернуть средний чек вообще. Что туда должно входить?А об этом надо спросить того, кто ставит вам задачу.
...
Рейтинг: 0 / 0
Помогите с запросом
    #38722203
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще вопрос: мне нужно получить среднее кол-во заказов за текущий месяц. Делаю так:
Код: sql
1.
2.
3.
select count(mission.id)/datediff(DATE_ADD(LAST_DAY(CURDATE()), INTERVAL 1 DAY),LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH) from mission where driverInfo_id = :id
                     AND mission.mission.time_requesting > LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH
                     AND mission.mission.time_requesting < DATE_ADD(LAST_DAY(CURDATE()), INTERVAL 1 DAY)


Т.е. беру все записи в текущем месяце и делю на кол-во дней в текущем месяце. Правильно?
А как сделать: получить среднее кол-во заказов в месяц (т.е. без уточнения какой это месяц)
...
Рейтинг: 0 / 0
Помогите с запросом
    #38722406
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTЕще вопрос: мне нужно получить среднее кол-во заказов за текущий месяц. Делаю так:
<...>
Т.е. беру все записи в текущем месяце и делю на кол-во дней в текущем месяце . Правильно?Вообще-то это получается среднее количеством заказов в день . А правильно или нет - это опять же надо у постановщика задачи спрашивать, мы-то откуда можем это знать?
JulTА как сделать: получить среднее кол-во заказов в месяц (т.е. без уточнения какой это месяц)Выбрать пары "месяц - количество заказов", после чего посчитать среднее по второму полю выборки.
...
Рейтинг: 0 / 0
Помогите с запросом
    #38722472
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirВыбрать пары "месяц - количество заказов", после чего посчитать среднее по второму полю выборки.
Очень прошу, напишите, пожалуйста, запрос
...
Рейтинг: 0 / 0
Помогите с запросом
    #38723060
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE `test` (
  `id` bigint(20) NOT NULL,
  `sum` double NOT NULL,
  `date_operation` datetime DEFAULT NULL,
  `driver_id` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



Код: sql
1.
2.
3.
4.
5.
INSERT INTO `test` (`sum`, `date_operation`,`driver_id`) VALUES ('6', '2013-06-21 16:37:33', '6');
INSERT INTO `test` (`sum`, `date_operation`,`driver_id`) VALUES ('6', '2014-06-03 17:37:37', '6');
INSERT INTO `test` (`sum`, `date_operation`,`driver_id`) VALUES ('6', '2014-07-25 18:45:12', '6');
INSERT INTO `test` (`sum`, `date_operation`,`driver_id`) VALUES ('6', '2014-07-14 19:37:43', '6');
INSERT INTO `test` (`sum`, `date_operation`,`driver_id`) VALUES ('6', '2014-08-18 10:37:23', '6');



1) Общее кол-во заказов:
select count(*) from test where driver_id = 6

2) среднее кол-во заказов за месяц:
Код: sql
1.
2.
select min(DATE_FORMAT(date_operation, '%Y%m')) from test where driver_id = 6
select max(DATE_FORMAT(date_operation, '%Y%m')) from test where driver_id = 6


после беру разницу между мин и мах:
Код: sql
1.
SELECT PERIOD_DIFF(мах,:мин)


и далее делю общее количество из 1) на PERIOD_DIFF
Код: sql
1.
SELECT count(*)/PERIOD_DIFF('MAX','MIN') from test where driver_id=6


3) кол-во за последний месяц
Код: sql
1.
SELECT count(*) from test where driver_id = 6 and date_operation > LAST_DAY( DATE_SUB( CURDATE( ) , INTERVAL 2 MONTH ) )  INTERVAL 1 DAY AND  date_operation < DATE_ADD( LAST_DAY( CURDATE( ) - INTERVAL 1 MONTH ) , INTERVAL 1 DAY )


4) сумма за предыдущий месяц:
Код: sql
1.
2.
SELECT sum(sum) from test where driver_id = 6 and date_operation > LAST_DAY( DATE_SUB( CURDATE( ) , INTERVAL 2 MONTH ) ) + INTERVAL 1 DAY 
AND  date_operation < DATE_ADD( LAST_DAY( CURDATE( ) - INTERVAL 1 MONTH ) , INTERVAL 1 DAY )


5) общая сумма
Код: sql
1.
SELECT SUM(sum) from test where driver_id = 6


6) средняя сумма в месяц за весь период
Код: sql
1.
SELECT avg(sum) from test where driver_id = 6


7) средняя сумма в месяц за последний месяц
Код: sql
1.
SELECT avg(sum) from test where driver_id = 6 and date_operation > LAST_DAY( DATE_SUB( CURDATE( ) , INTERVAL 2 MONTH ) ) + INTERVAL 1 DAY AND  date_operation < DATE_ADD( LAST_DAY( CURDATE( ) - INTERVAL 1 MONTH ) , INTERVAL 1 DAY )


8) средний чек вообще (сумма всех денег разделить на весь период)
беру всю сумму:
Код: sql
1.
SELECT SUM(sum) from test where driver_id = 6


и делю на количество месяцев PERIOD_DIFF('MAX','MIN')
А теперь скажи мне, пожалуйста, правильно ли я сделала?
...
Рейтинг: 0 / 0
Помогите с запросом
    #38723074
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2)Ну, если вы так определяете "среднее за месяц", значит, так оно и должно считаться.
7)Наконец-то я понял у вас "средняя сумма" - это "средняя сумма операции", и один месяц с двумя операциями по 500 <> другому месяцу с одной операцией на 1000.

Вообще как-то странно выходит. В одном месте у вас "среднее" - это среднее по периоду (за месяц). А в другом - это среднее по операциям. Может, конечно, так и должно быть (разные средние показатели, ничего удивительного), но опять же пока вы сами не определитесь, как оно должно считаться - даже не в плане написания запроса, а в плане постановки задачи -, никто вам не скажет, верно написано или неверно. Сами-то запросы написаны правильно. Но вот выводят ли они то, что вы хотите получить, не скажет никто, кроме вас.
...
Рейтинг: 0 / 0
Помогите с запросом
    #38723124
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglir2)Ну, если вы так определяете "среднее за месяц", значит, так оно и должно считаться.
7)Наконец-то я понял у вас "средняя сумма" - это "средняя сумма операции", и один месяц с двумя операциями по 500 <> другому месяцу с одной операцией на 1000.

Вообще как-то странно выходит. В одном месте у вас "среднее" - это среднее по периоду (за месяц). А в другом - это среднее по операциям. Может, конечно, так и должно быть (разные средние показатели, ничего удивительного), но опять же пока вы сами не определитесь, как оно должно считаться - даже не в плане написания запроса, а в плане постановки задачи -, никто вам не скажет, верно написано или неверно. Сами-то запросы написаны правильно. Но вот выводят ли они то, что вы хотите получить, не скажет никто, кроме вас.
Нужно среднее по периоду
1. средняя сумма в месяц (в деньгах) за текущий месяц
2. средняя сумма в месяц (в деньгах) за весь период
Им соответствуют такие запросы:
Код: sql
1.
2.
1. SELECT avg(sum) from test where driver_id = 6 and dateStart > y AND  dateStart < x
2. SELECT avg(sum) from test where driver_id = 6


Правильно ли будет так?
и что означает, например, когда мы делим среднее avg(sum) на кол-во месяцев со дня первой записи?
...
Рейтинг: 0 / 0
Помогите с запросом
    #38723217
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT, ещё раз спрашиваю - что такое "средняя сумма в месяц"? если этой замысловатой конструкцией вы обозначаете среднюю сумму операции, то запросы в последнем посте правильные (правда, непонятно, при чём тут месяц, ну да ладно)
...
Рейтинг: 0 / 0
Помогите с запросом
    #38723558
belkaU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, забавный пост получился, я думал, автор закончил, поэтому стал писать ))

ПОдскажите ещё пожалуйста.

Абсолютно рабочий запрос у меня получился $sql=( "SELECT contentid FROM modx_site_tmplvar_contentvalues WHERE value LIKE '8::%' AND tmplvarid='11' OR value LIKE '8::%' AND tmplvarid='11' );'

Как правильно заменить теперь 8::% и 11 на переменные?
...
Рейтинг: 0 / 0
Помогите с запросом
    #38723565
belkaU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попытался в старый запрос добавить - не хавает.

Другой синтаксис не хавает уже скуль

Код: php
1.
2.
3.
// $sql=( "SELECT contentid FROM modx_site_tmplvar_contentvalues WHERE value LIKE "'.$doc.'"::%'" AND tmplvarid='.$tvid.' OR value LIKE '%||.$doc.::%' AND tmplvarid='.$tvid.'" );

$sql=('SELECT `contentid` FROM `modx_site_tmplvar_contentvalues` WHERE value Like "'.$doc.'::%" AND tmplvarid='.$tvid.' OR value LIKE "%||'.$doc.'::%" AND tmplvarid='.$tvid.'" ');
...
Рейтинг: 0 / 0
Помогите с запросом
    #38723570
belkaU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот более полный код.

Так не понимает $doc

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
[SRC sql]<?php
$doc = (isset($doc)) ? $doc : 0;	
$tvid = (isset($tvid)) ? $tvid : 0;
	
	
$sql=( "SELECT contentid FROM modx_site_tmplvar_contentvalues WHERE value LIKE '".$doc."::%' AND tmplvarid='".$tvid."' OR value LIKE '%||."$doc."::%' AND tmplvarid='".$tvid."' );
//$sql=('SELECT `contentid` FROM `modx_site_tmplvar_contentvalues` WHERE value Like "'.$doc.'::%" AND tmplvarid='.$tvid.' OR value LIKE "%||'.$doc.'::%" AND tmplvarid='.$tvid.'" ');

$result = mysql_query($sql);

[/SRC]
...
Рейтинг: 0 / 0
Помогите с запросом
    #38723581
belkaU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Простите за ламерство, не привык так тщательно кавычки проверять ))

верный запрос
Код: php
1.
$sql=('SELECT `contentid` FROM `modx_site_tmplvar_contentvalues` WHERE value LIKE "'.$doc.'::%" AND tmplvarid="'.$tvid.'" OR value LIKE "%||'.$doc.'::%" AND tmplvarid="'.$tvid.'" ');
...
Рейтинг: 0 / 0
Помогите с запросом
    #38724017
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
belkaU, покажите вывод
Код: sql
1.
echo $sql

. То есть запрос с уже подставленными значениями. Может, у вас инты как-то не так в строку трансформируются - например, с ведущими нулями или пробелами.
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите с запросом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]