powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка своеобразная ...
26 сообщений из 26, показаны все 2 страниц
Выборка своеобразная ...
    #38655582
caHek2x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть например таблица ...
1 заппись_1 10 10,05,2012
2 заппись_2 9 11,05,2012
3 заппись_3 8 11,05,2012
4 заппись_17 8 10,05,2019
5 заппись_4 7 11,05,2012
6 заппись_16 7 10,05,2018
7 заппись_5 6 11,05,2012
8 заппись_15 6 10,05,2017
9 заппись_6 5 11,05,2012
10 заппись_14 5 10,05,2016
11 заппись_7 4 10,05,2012
12 заппись_13 4 10,05,2015
13 заппись_8 3 10,05,2012
14 заппись_12 3 10,05,2014
15 заппись_9 2 10,05,2012
16 заппись_11 2 10,05,2013
17 заппись_10 1 10,05,2012

мне надо отсортировать по 3-ему столбцу (там где значение 10,9,8)
и сделать выборку до тех пор пока в 4-ем столбце встречается дата 11,05,2012 ... то есть не все записи с такой датой а именно пока она встречается ... то есть в таблице выше это будут записи от 1 до 9 ...
пока единственное что приходит в голову это то что придется считать все записи и перебирать их ... но думаю можно придумать изощренный вопрос ... help ...
...
Рейтинг: 0 / 0
Выборка своеобразная ...
    #38655594
caHek2x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чето я в первом посте немного не так данные предоставил ... (эксель с годом нахимичил ...)
вот скрин и немного другие данные ... мне надо сделать выборку с первой записи (с учетом сортировки) до последней записи в которой есть нужная мне дата. .. (на скрине диапазон который должен получиться в итоге выделен синим ...)
...
Рейтинг: 0 / 0
Выборка своеобразная ...
    #38655664
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"1 заппись_1 10 10,05,2012" - пусть это будут id,a,b,dt

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select table.*
from table
join (
 select @num:=@num+1 as n, id
 from table, (@select @num:=0) zz
 order by b desc
) t1 on table.id=t1.id
join (
 select max(n) as maxN from (
  select @num:=@num+1 as n, dt
  from table, (@select @num:=0) zz
  order by b desc
 ) t0
 where t0.dt='2012-05-10'
) t2 on t1.n<=t2.maxN

за понимаением происходящего - в FAQ: Нумерация строк и другие вопросы про использование переменных или просто погоняйте подзапросы и посмотрите на результаты.
...
Рейтинг: 0 / 0
Выборка своеобразная ...
    #38655744
caHek2x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а вы б не могли конкретный ваш запрос расписать последовательно что зачем тут надо ...
работать он работает как надо .. теперь бы разобраться ..
и да насколько он оптимален ? потому что как я посмотрел по EXPLAIN он таблицу 4 раза полностью прогоняет .. или я не так понял ...
...
Рейтинг: 0 / 0
Выборка своеобразная ...
    #38655766
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
caHek2x,

выборка своеобразная, ну и решение такое же :)
а насчёт "расписать"...
в t0 мы получаем (номер строки, дата) в упорядоченном по нужному полю наборе (то, что у вас на картинке)
в t2 мы из этого набора получаем максимальный номер с нужной датой (т.е. последний нужный нам номер)
в t1 мы получаем (номер строки, ид записи) с тем же упорядочиванием, что и в t0
потом идёт джойн основы по ид с t1 и отсечка по (t1.номер<=t0.номер) - получаем результат

Сейчас вот расписал и увидел, что можно быстрее - сразу всё (а не только ид и номер строки) получить в Т1, оттуда же и выводить итоговый результат.
...
Рейтинг: 0 / 0
Выборка своеобразная ...
    #38655799
caHek2x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хорошо смотрите ... а если я разобью на два запроса запроса
первым получу количество элементов
select max(n) as maxN from (
select @num:=@num+1 as n, date
from test, (select @num:=0) zz
order by nomer asc
) t0
where t0.date='2014-05-30 13:27:24'

вторым сделаю выборку с сортировкой и лимитом на количество элементов ?
так будет не оптимальнее ?
...
Рейтинг: 0 / 0
Выборка своеобразная ...
    #38655810
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
caHek2x,

не на количество, а на номер последнего
да, я об этом и говорил, сразу что-то не дошло до меня :)
...
Рейтинг: 0 / 0
Выборка своеобразная ...
    #38655824
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
caHek2x,

или я не понял задачу, или :

Код: sql
1.
2.
3.
4.
5.
6.
select * 
from tableх t1
where t1.b >= (select min(t2.b) 
                 from tableх t2 
                where t2.dt = '2014-05-29')
order by b desc, dt desc
...
Рейтинг: 0 / 0
Выборка своеобразная ...
    #38655830
caHek2x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbc, вы не поняли задачу ... сортировать по дате не надо ... просто надо вывести от первой записи до последней записи в которой есть нужная дата .....
...
Рейтинг: 0 / 0
Выборка своеобразная ...
    #38655839
caHek2x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglircaHek2x,

не на количество, а на номер последнего
да, я об этом и говорил, сразу что-то не дошло до меня :)
а как это дело сделать в одном запросе ?
сделать два разных запроса в пхп это я смогу ... но все же интересно как с переменными или без них намудрить в одном запросе .. .ато мои попытке не увенчались успехом ...
fail:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select *
from test,
(select max(n) as maxN from (
  select @num:=@num+1 as n, date
  from test, (select @num:=0) zz
  order by nomer asc
 ) t0
where t0.date='2014-05-30 13:27:24') cc
order by nomer asc 
limit 0, cc.maxN
...
Рейтинг: 0 / 0
Выборка своеобразная ...
    #38656030
caHek2x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так кто поможет объединить два запроса ...

выдает количество записей (x):
Код: sql
1.
2.
3.
4.
5.
select max(n) as maxN from (
   select @num:=@num+1 as n, date
   from test, (select @num:=0) zz
   order by nomer asc
) t0


where t0.date='2014-05-30 13:27:24'
на это количество мне надо лимит сделать:
Код: sql
1.
2.
3.
4.
select *
from test
order by nomer asc
limit 0, x
...
Рейтинг: 0 / 0
Выборка своеобразная ...
    #38656065
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
caHek2x,


Мой запрос выведет вам то что вы отметили
сине-фиолетовым в екселе.
...
Рейтинг: 0 / 0
Выборка своеобразная ...
    #38656071
caHek2x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
это да ... но я вот думаю как бы его оптимизировать ...
...
Рейтинг: 0 / 0
Выборка своеобразная ...
    #38656078
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
caHek2xэто да ... но я вот думаю как бы его оптимизировать ...


если мой запрос верный по логике,
то отлаживайте индексы и все будет хорошо.
...
Рейтинг: 0 / 0
Выборка своеобразная ...
    #38656088
caHek2x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ваш запрос верный но ...
может я не верно понимаю команду explain ...
но если провести запрос на выборку количества нужных мне записей и потом провести запрос на выборку с лимитом то вот что выходит:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select max(n) as maxN from (
         select @num:=@num+1 as n, date
         from test, (select @num:=0) zz
         order by nomer asc
      ) t0
      where t0.date='2014-05-30 13:27:24'

SELECT * FROM `test`  ORDER BY nomer asc limit 8 




а если проводить полностью вашим запросом то вот что выходит:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select *
from test
   join (
      select @num:=@num+1 as n, id
      from test, (select @num:=0) zz
      order by nomer asc
   ) t1 on test.id=t1.id
   join (
      select max(n) as maxN from (
         select @num:=@num+1 as n, date
         from test, (select @num:=0) zz
         order by nomer asc
      ) t0
      where t0.date='2014-05-30 13:27:24'
   ) t2 on t1.n<=t2.maxN


...
Рейтинг: 0 / 0
Выборка своеобразная ...
    #38656092
caHek2x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
по моему первый вариант разбитого запроса более оптимален ... но придется делать два отдельных запроса ... вот я и спрашиваю можно ли как то в лимит второго запроса вставить первый ...
...
Рейтинг: 0 / 0
Выборка своеобразная ...
    #38656137
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
caHek2x,


есть вполне стандартные подходы к таким задачам.

1. правильно поставить задачу
2. определить желаемую скорость
3. любым способом решить ее логически правильно
4. замерить скорость решения и сравнить с желаемым
5. если достаточно быстро -- то опционально подумать про решение покрасивше
6. если медлено, начинать проверять почему медлено в двух направлениях
6.1. решать другим способом (подселекты, переменные, еше что-нибудь)
6.2 добавлять нужные индексы

Сейчас у вас только есть -1- и -3- .
Добавьте 2,4,5 и будет конкретное обсуждение.
...
Рейтинг: 0 / 0
Выборка своеобразная ...
    #38656146
caHek2x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я вас понял, а конкретно по вопросу:
как можно вставить/соединить запрос 1 в запрос 2 в лимит ?
1:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT max(n) as maxN FROM (
   SELECT @num:=@num+1 as n, date
   from test, (SELECT @num:=0) zz
   ORDER BY nomer ASC
) t0
WHERE t0.date='2014-05-30 13:27:24'


2:
Код: sql
1.
SELECT * FROM `test`  ORDER BY nomer asc limit 8(вместо 8 maxN из запроса 1) 
...
Рейтинг: 0 / 0
Выборка своеобразная ...
    #38656196
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стою на асфальте я
В лыжи обутый
То ли лыжи не едут
То ли с головой не все в порядке...

caHek2xпо моему первый вариант разбитого запроса более оптимален ... но придется делать два отдельных запроса ... вот я и спрашиваю можно ли как то в лимит второго запроса вставить первый ...
Какое отношение ваш второй запросcaHek2xа если проводить полностью вашим запросом то вот что выходит:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select *
from test
   join (
      select @num:=@num+1 as n, id
      from test, (select @num:=0) zz
      order by nomer asc
   ) t1 on test.id=t1.id
   join (
      select max(n) as maxN from (
         select @num:=@num+1 as n, date
         from test, (select @num:=0) zz
         order by nomer asc
      ) t0
      where t0.date='2014-05-30 13:27:24'
   ) t2 on t1.n<=t2.maxN


имеет к ранее предложеннному оптимальному запросуjavajdbc
Код: sql
1.
2.
3.
4.
5.
6.
select * 
from tableх t1
where t1.b >= (select min(t2.b) 
                 from tableх t2 
                where t2.dt = '2014-05-29')
order by b desc -- , dt desc -- закомментировал, раз ТСу желтый цвет не нравится

все, больше ничего не надо. А нумерация п/п - в массиве PHP ее получите забесплатно по получении данных.
...
Рейтинг: 0 / 0
Выборка своеобразная ...
    #38656205
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чувак, может ты бы расказал что за хитрые ты запросы делаешь...

посмотри внимательно на свой скрин.
там записи номер 7 и 13. ты сортируешь по полю, где у обоих значение 4

тыж понимаешь что выдать может первее 7, а может и 13...это не где по твоему условию не оговариваеться.

и получаеться - ты можеш получить в выводе 7 запись, а можешь и не получить...смотря как будет осуществлена выборка!!!

вот и напрашиваеться вопрос - ты то сам понимаешь чётко что ты хочешь получить?
...
Рейтинг: 0 / 0
Выборка своеобразная ...
    #38656435
caHek2x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alex564657498765453чувак, может ты бы расказал что за хитрые ты запросы делаешь...

посмотри внимательно на свой скрин.
там записи номер 7 и 13. ты сортируешь по полю, где у обоих значение 4

тыж понимаешь что выдать может первее 7, а может и 13...это не где по твоему условию не оговариваеться.

и получаеться - ты можеш получить в выводе 7 запись, а можешь и не получить...смотря как будет осуществлена выборка!!!

вот и напрашиваеться вопрос - ты то сам понимаешь чётко что ты хочешь получить?
я понимаю сам четко что я хочу получить ... и это таблица просто пример ... для того чтобы разобрать нужное мне ... там где я использовать буду там с сортировкой и тд все в порядке ...
...
Рейтинг: 0 / 0
Выборка своеобразная ...
    #38656438
caHek2x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007Стою на асфальте я
В лыжи обутый
То ли лыжи не едут
То ли с головой не все в порядке...
Какое отношение ваш второй запрос
имеет к ранее предложеннному оптимальному запросу

я имел ввиду вот два запроса, не так выразился просто ... :
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select max(n) as maxN from (
         select @num:=@num+1 as n, date
         from test, (select @num:=0) zz
         order by nomer asc
      ) t0
      where t0.date='2014-05-30 13:27:24'

SELECT * FROM `test`  ORDER BY nomer asc limit вот в этот лимит надо вставить значение запроса что выше
...
Рейтинг: 0 / 0
Выборка своеобразная ...
    #38656441
caHek2x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторselect *
from tableх t1
where t1.b >= (select min(t2.b)
from tableх t2
where t2.dt = '2014-05-29')
order by b desc -- , dt desc -- закомментировал, раз ТСу желтый цвет не нравится

этот вариант прекрасный .. но он не сработает если b будет повторятся ...
...
Рейтинг: 0 / 0
Выборка своеобразная ...
    #38656574
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
caHek2xа как это дело сделать в одном запросе ?странно, прочитав предыдущий вопрос, я подумал, что вы это и так поняли...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select -- нужные поля из t1
from (
 select @num:=@num+1 as n, id, -- и все остальные нужные поля из table
 from table, (@select @num:=0) zz
 order by b desc
) t1 
join (
 select max(n) as maxN from (
  select @num:=@num+1 as n, dt
  from table, (@select @num:=0) zz
  order by b desc
 ) t0
 where t0.dt='2012-05-10'
) t2 on t1.n<=t2.maxN


javajdbcМой запрос выведет вам то что вы отметилипоскольку и впрямь
alex564657498765453выдать может первее 7, а может и 13...это не где по твоему условию не оговариваеться, то я подозреваю, что у ТС может быть ещё какая-то сортировка по другим полям, при которой часть записей с мин(б) попадает в результат, а часть нет. Наверное, это он и имел в виду здесь:
caHek2xэтот вариант прекрасный .. но он не сработает если b будет повторятся
...
Рейтинг: 0 / 0
Выборка своеобразная ...
    #38656587
caHek2x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirстранно, прочитав предыдущий вопрос, я подумал, что вы это и так поняли...

я просто немножко множко запутался ... спасибо за помощь окончательный вариант запроса меня устраивает ...
tanglirто я подозреваю, что у ТС может быть ещё какая-то сортировка по другим полям

да, то что я описал как задание сдесь это просто упрощенный пример(чтоб не путаться) чтоб понять именно ту задачу которую решили вашим запросом ....
...
Рейтинг: 0 / 0
Выборка своеобразная ...
    #38657722
caHek2x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
help ... на mySQL это все прекрасно работало ... но мне надо сделать такой запрос на SQLite (андроид) ... а там переменных нет ... (@num:=@num+1) ...
как бы сделать этот же запрос но без переменных ?
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка своеобразная ...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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