powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите с логикой запроса.
39 сообщений из 39, показаны все 2 страниц
Помогите с логикой запроса.
    #38487041
hedgehogelez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую форумчане. Есть такая таблица:

calc_month номер месяца по порядку rank он и есть ранг :-)
Так вот никак до меня не дойдет, как выбрать все поля где rank > 6 встречается восемь месяцев подряд, типа
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
...  EXISTS (SELECT 1 FROM `mem_net` WHERE `mem_net`.`calc_month` = 53 AND `mem_net`.`rank` > 6 ) AND
  EXISTS (SELECT 1 FROM `mem_net` WHERE `mem_net`.`calc_month` = 52 AND `mem_net`.`rank` > 6 ) AND
  EXISTS (SELECT 1 FROM `mem_net` WHERE `mem_net`.`calc_month` = 51 AND `mem_net`.`rank` > 6 ) AND
  EXISTS (SELECT 1 FROM `mem_net` WHERE `mem_net`.`calc_month` = 50 AND `mem_net`.`rank` > 6 ) AND
  EXISTS (SELECT 1 FROM `mem_net` WHERE `mem_net`.`calc_month` = 49 AND `mem_net`.`rank` > 6 ) AND
  EXISTS (SELECT 1 FROM `mem_net` WHERE `mem_net`.`calc_month` = 48 AND `mem_net`.`rank` > 6 ) AND
  EXISTS (SELECT 1 FROM `mem_net` WHERE `mem_net`.`calc_month` = 47 AND `mem_net`.`rank` > 6 ) AND
  EXISTS (SELECT 1 FROM `mem_net` WHERE `mem_net`.`calc_month` = 46 AND `mem_net`.`rank` > 6 )


Но вот как проверить это за весь год (т.е с 53 до 45)? OR использовать нельзя в момент ахинею выдавать начнет.
Наведите на мысль плиз....
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38487064
можно ведь проверить, что за заданный промежуток времени НЕ встречается рангов <= 6 ;)
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38487068
ну либо считать кол-во месяцев и проверять, что их ровно 8.
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38487097
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё такое великолепно делается курсором.
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38487104
hedgehogelez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,

Чё за курсор?
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38487110
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38487120
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Торможу с утра, не сообразил проДобрый Э - Эхможно ведь проверить, что за заданный промежуток времени НЕ встречается рангов <= 6 ;)
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38487180
hedgehogelez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007,
Переменные рулят! :-)
Почемуто выдает:
Код: plsql
1.
2.
3.
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select distinct c.*
from mem_net m
join mem_net c on c.rank>6 and c.calc_month' [color=red]at line 3[/color]
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38487205
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или перед select есть неотображаемый "левый" символ, или показывай ВЕСЬ запрос и рассказывай (или показывай код), как ты его выполняешь.
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38487208
hedgehogelez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
set @q=45;
select distinct c.*
from mem_net m
join mem_net c on c.rank>6 and c.calc_month between m.calc_month and m.calc_month+@q-1
where m.rank>6 and @q<=(
  select count(*) 
  from mem_net c
  where c.rank>6 and c.calc_month between m.calc_month and m.calc_month+@q-1
  )
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38487217
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina и рассказывай (или показывай код), как ты его выполняешь.
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38487233
hedgehogelez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Так вроде ж код выложил, только там set @q=3;
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38487239
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КАК ТЫ ЭТОТ КОД ИСПОЛНЯЕШЬ НА СЕРВЕРЕ???
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38487240
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХЗ... Может, сработает более оптимальный(/правильный) вариант?:)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
;
select distinct c.*
from mem_net m
join mem_net c on c.calc_month between m.calc_month and m.calc_month+@q-1
cross join (select @q:=4 q)q
where not exists(
  select 1
  from mem_net e
  where e.calc_month between m.calc_month and m.calc_month+@q-1 and e.rank <=6
  );
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38487243
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, он неправильный))) Сорь...
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38487245
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007 , да ща окажется, что он через mysql_query его пытается серверу скормить, или какая анальногичная хрень...
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38487254
hedgehogelez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

SQL Manager 2011 Перезапустил начал выполнять. Такая косячная хрень... Второй месяц юзаю обплевался.
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38487262
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hedgehogelez,

зачем второй месяц юзать косячную хрень? ничего лучше не нашлось?
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38487310
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hedgehogelezMasterZiv,

Чё за курсор?

http://dev.mysql.com/doc/refman/5.1/en/cursors.html
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38487315
hedgehogelez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir,

Мда... хрень точно косячная... Аналогично результат не ICE...
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38487316
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hedgehogelezCygapb-007,
Переменные рулят! :-)



С переменными я бы как раз не связывался.
Потому что не понятно, как они работают -- порядок вычисления предложений в запросе не определён...
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38487365
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivhedgehogelezCygapb-007,
Переменные рулят! :-)



С переменными я бы как раз не связывался.
Потому что не понятно, как они работают -- порядок вычисления предложений в запросе не определён...Не в данном случае:)

А вообще да, в 5.5 и в 5.6 они по-разному обрабатываются :)
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38487432
hedgehogelez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мда.... печально как-то это всё...
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38487460
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007Не в данном случае:)
А вообще да, в 5.5 и в 5.6 они по-разному обрабатываются :)

не дашь ли ты ссылку на документацию, где описывается, как работают переменные в запросах?
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38487474
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivCygapb-007Не в данном случае:)
А вообще да, в 5.5 и в 5.6 они по-разному обрабатываются :)

не дашь ли ты ссылку на документацию, где описывается, как работают переменные в запросах?Ссылку не дам, но лично сталкивался с запросом на переменных, правильно работающем в 5.5 и выдающем бред в 5.6. Связано было вроде с оптимизацией подзапросов в 5.6.

Деталей уже не помню, но итог в памяти осел... в смысле отложился
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38487480
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hedgehogelezхрень точно косячная... Аналогично результат не ICE...
Любая IDE, не поставляемая в составе инструментальных средств сервера, по определению хрень косячная. Ибо неизвестно, как именно она взаимодействует с сервером, а также что ещё она делает с запросом по пути туда, и с ответом по пути обратно.

В твоём случае, я думаю, просто схема общения с сервером не поддерживает мультизапросы. Попробуй инициализацию переменной перенести из выражения в секцию FROM.
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38487634
hedgehogelez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пишу скрипт перловский с хешем от безнадеги.... То ж на тож получается... :-(
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38487766
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hedgehogelez , а что, вот это не помогает?AkinaПопробуй инициализацию переменной перенести из выражения в секцию FROM.
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38488430
hedgehogelez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007,

Запрос работает и без переноса переменной, но он работает, работает и работает и в прошествии 1ч 44мин выполнение было мной прервано...
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38488462
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hedgehogelezЗапрос работает и без переноса переменной, но он работает, работает и работает и в прошествии 1ч 44мин выполнение было мной прервано...
Какой именно? вот этот: 15231044 ? даже несмотря на его полную бредовость и несоблюдение синтаксиса?
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38488574
hedgehogelez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

АГА! :-)
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38488661
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hedgehogelezCygapb-007,

Запрос работает и без переноса переменной, но он работает, работает и работает и в прошествии 1ч 44мин выполнение было мной прервано...Это не то же самое, что падает с синтаксической ошибкой, это раз.

Второе - есть большая разница (по времени обработки) между проверкой 8 месяцев подряд и 45 месяцев подряд

Третье - если устраивают результаты на маленькой тестовой таблице, то можно озадачится проблемой оптимизации запроса по времени выполнения: анализом плана выполнения, настройкой индексов, модернизацией запроса. Предложенный же ранее запрос преследовал цель выдать предположительно правильный результат за неопределенной время.
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38488958
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hedgehogelezAkina,

АГА! :-)
Вот не поленюсь сюда скопировать этот "шедевр".

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
set @q=45;
select distinct c.*
from mem_net m
join mem_net c on c.rank>6 and c.calc_month between m.calc_month and m.calc_month+@q-1
where m.rank>6 and @q<=(
  select count(*) 
  from mem_net c
  where c.rank>6 and c.calc_month between m.calc_month and m.calc_month+@q-1
  )



У тебя в нескольких местах явно берутся поля из таблицы с алиасом 'с'. Попробуй доказательно обосновать, какая из двух указанных мной копий использована в каждом конкретном случае.
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38489247
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinahedgehogelezAkina,

АГА! :-)
Вот не поленюсь сюда скопировать этот "шедевр".

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
set @q=45;
select distinct c.*
from mem_net m
join mem_net c on c.rank>6 and c.calc_month between m.calc_month and m.calc_month+@q-1
where m.rank>6 and @q<=(
  select count(*) 
  from mem_net c
  where c.rank>6 and c.calc_month between m.calc_month and m.calc_month+@q-1
  )



У тебя в нескольких местах явно берутся поля из таблицы с алиасом 'с'. Попробуй доказательно обосновать, какая из двух указанных мной копий использована в каждом конкретном случае.Это что за наезды))?

Не верите, что такой скрипт рабочий? Сходите по ранее приведенной ссылке http://sqlfiddle.com/#!2/9cabac/1
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38489250
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Долгий - да, но про оптимизацию (на тот момент) никто не говорил...
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38489261
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
решает следующую задачу:

Отобрать последовательные записи таблицы, отсортированные по CALC_MONTH, в которых все ранги > 6, с длиной последовательности не менее @q строк подряд
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38489395
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hedgehogelezПриветствую форумчане. Есть такая таблица:

calc_month номер месяца по порядку rank он и есть ранг :-)
Так вот никак до меня не дойдет, как выбрать все поля где rank > 6 встречается восемь месяцев подряд, типа
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
...  EXISTS (SELECT 1 FROM `mem_net` WHERE `mem_net`.`calc_month` = 53 AND `mem_net`.`rank` > 6 ) AND
  EXISTS (SELECT 1 FROM `mem_net` WHERE `mem_net`.`calc_month` = 52 AND `mem_net`.`rank` > 6 ) AND
  EXISTS (SELECT 1 FROM `mem_net` WHERE `mem_net`.`calc_month` = 51 AND `mem_net`.`rank` > 6 ) AND
  EXISTS (SELECT 1 FROM `mem_net` WHERE `mem_net`.`calc_month` = 50 AND `mem_net`.`rank` > 6 ) AND
  EXISTS (SELECT 1 FROM `mem_net` WHERE `mem_net`.`calc_month` = 49 AND `mem_net`.`rank` > 6 ) AND
  EXISTS (SELECT 1 FROM `mem_net` WHERE `mem_net`.`calc_month` = 48 AND `mem_net`.`rank` > 6 ) AND
  EXISTS (SELECT 1 FROM `mem_net` WHERE `mem_net`.`calc_month` = 47 AND `mem_net`.`rank` > 6 ) AND
  EXISTS (SELECT 1 FROM `mem_net` WHERE `mem_net`.`calc_month` = 46 AND `mem_net`.`rank` > 6 )


Но вот как проверить это за весь год (т.е с 53 до 45)? OR использовать нельзя в момент ахинею выдавать начнет.
Наведите на мысль плиз....

уточните задачу:

1. вам надо выбрать контракты с выданым условием?
2. или надо выдать месяцы с данным есливоем
3. или надо выдать все записи которые удовлетворяют
условию (по 8 записей на попадание)?
4. контракт,ранк, калк_месяц -- уникальный набор или бывают повторения?
5. контракт, калк_месяц -- уникальный набор или бывают повторения?
6. сколько записей всего?с колько конреактов?
сколько уникальных контрактов-калк_месяц?
сколько уникальных контрактов-калк_месяц-ранк?
сколько уникальных контрактов-калк_месяц-(ранк>6)?
7. какие требования к скорости?
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38489402
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
8. это редко-исполняемый запрос/репорт
или часто-запрашиваемый запрос?
9. насколько часто меняются данные?
10. насколько важна актуальность ресультата?
(например допустима ли задержка по
актуальности на полдня, почаса?)
...
Рейтинг: 0 / 0
Помогите с логикой запроса.
    #38499700
hedgehogelez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbc,

На протяжении 8-ми месяцев contract должен выдержать rank > 6 по каждому месяцу своя таблица....

Проблема решилась скриптом.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
   	$agents_query = $subs::dbh->prepare('SELECT id,contract,rank,calc_month, (SELECT fio FROM net WHERE `mem_net`.contract = `net`.contract AND `net`.depo<>99992),(SELECT rank FROM net WHERE `mem_net`.contract = `net`.contract AND `net`.depo<>99992)
										 FROM mem_net WHERE '.$add_query.' 1 AND (SELECT 1 FROM net WHERE `mem_net`.contract = `net`.contract AND `net`.depo<>99992) AND contract<>0 order by contract');     $agents_query->execute();						
	@list_agent = $agents_query->fetchrow; # Подготовили из таблицы кого нужно
и выбрали
 while (@list_agent) {		
			$counter++;		
			if ($counter%2) {
				$bef1 = '<tr class="lr1">';
			}
			else {
				$bef1 = '<tr class="lr2">';
			}
		
			$page_content .= $bef1;
	
	 if ($temp != $list_agent[1]) {$temp=$list_agent[1];$calc_month=1;} 
	 else {if ($list_agent[2]>=$url_command{'rank'}) {$calc_month++;if($calc_month>=$month_count){
	 $page_content .= $bef2.$temp.$aft2;
	 $page_content .= $bef2.$list_agent[4].$aft2;
	 $page_content .= $bef2.&subs::rank_by_id($list_agent[5]).$aft2;
   # $page_content .= $bef2.&subs::print_month_by_id($list_agent[3]).$aft2;
	 $calc_month=1;} } else {$calc_month=1;}
	 }
			
	 $page_content .= $aft1;

	 @list_agent = $agents_query->fetchrow;
	}

    $agents_query->finish;
	$page_content .= '</table>';
...
Рейтинг: 0 / 0
39 сообщений из 39, показаны все 2 страниц
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите с логикой запроса.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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