powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вложенный SELECT
11 сообщений из 11, страница 1 из 1
Вложенный SELECT
    #39887330
romserg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Подскажите, почему выдаёт ошибку:
Код: sql
1.
2.
3.
SELECT main.recdate,main.rectime,main.equip,main.reason,
 (SELECT m.recdate, m.rectime FROM main AS m WHERE (m.num > main.num) AND (m.equip=main.equip) AND (m.state='ПУСК') LIMIT 1)
  FROM main WHERE (state='СТОП')



Мне нужно найти запись с состоянием СТОП и добавить к ней поля из записи с состоянием ПУСК, к-ая идёт после СТОПовой записи (для того же equip, но с состоянием ПУСК). Т.е. запись, когда машина остановлена, дополнить полями, когда она запущена.

Код: plaintext
1.
2.
3.
4.
5.
6.
num   recdate        rectime    equip   state
1       2019-10-11  10:40:45   М1       СТОП
2       2019-10-11  10:42:46   М2       СТОП
3       2019-10-11  13:46:17   М3       СТОП
4       2019-10-12  08:10:32   М1       ПУСК
5       2019-10-12  09:45:40   М3       ПУСК

Надо, напр., для М3 выдать дату/время стопа и дополнить полями дата/время пуска.

Вложенный select с одним полем работает:
Код: sql
1.
2.
3.
SELECT main.recdate,main.rectime,main.equip,main.reason,
 (SELECT m.recdate FROM main AS m WHERE (m.num > main.num) AND (m.equip=main.equip) AND (m.state='ПУСК') LIMIT 1)
  FROM main WHERE (state='СТОП')
...
Рейтинг: 0 / 0
Вложенный SELECT
    #39887340
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что Вы пытаетесь в одно поле одной записи затолкать два поля неопределённого количества записей.
...
Рейтинг: 0 / 0
Вложенный SELECT
    #39887345
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне нужно найти запись с состоянием СТОП и добавить к ней поля из записи с состоянием ПУСК, к-ая идёт после СТОПовой записи (для того же equip, но с состоянием ПУСК). Т.е. запись, когда машина остановлена, дополнить полями, когда она запущена.

Это надо JOIN-ом делать.
...
Рейтинг: 0 / 0
Вложенный SELECT
    #39887376
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Версия сервера?
MasterZiv
Мне нужно
А чего с мульта пишешь? али стыдно такое спрашивать?
...
Рейтинг: 0 / 0
Вложенный SELECT
    #39888068
romserg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina
Версия сервера?
MasterZiv
Мне нужно
А чего с мульта пишешь? али стыдно такое спрашивать?

Это человек цитировал, да без тегов, видимо. MasterZiv - это не я :)

Akina , можете что-то посоветовать по теме?
Я наковырял так:
Код: sql
1.
2.
3.
SELECT m1.recdate,m1.rectime,m1.equip,m1.reason,m2.recdate,m2.rectime FROM main AS m1
 LEFT JOIN main AS m2 ON m2.num=(SELECT m3.num FROM main AS m3 WHERE (m3.num>m1.num) AND (m3.equip=m1.equip) AND (m3.state='ПУСК') ORDER BY m3.num LIMIT 1)
  WHERE (m1.state='СТОП')


, но это получается подзапрос при каждом джойне. Вертится мысль о GROUP BY, но как применить его тут?
...
Рейтинг: 0 / 0
Вложенный SELECT
    #39888080
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Укажите версию MySQL, что ли... для решения такой задачи это важно.

А в принципе - обычный коррелированный подзапрос в SELECT... или два, ибо нужны два поля (какой, спрашивается, [censored] архитектор додумался поделить дату и время на два отдельных поля?). Или LATERAL, если версия позволит (хотя если версия позволит, лучше оконные функции в CTE применить).
...
Рейтинг: 0 / 0
Вложенный SELECT
    #39888171
romserg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina
Укажите версию MySQL

5.5.25 - MySQL Community Server

Akina
какой, спрашивается, [censored] архитектор додумался поделить дату и время на два отдельных поля?

Заказчик :)
...
Рейтинг: 0 / 0
Вложенный SELECT
    #39888377
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эх, старенький сервер-то. Придётся крутиться с подзапросами либо использовать пользовательские переменные.

Вот решение на переменных (без оптимизации):

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT num, recdate, rectime, equip, state, next_recdate, next_rectime
FROM ( SELECT main.*, 
              CASE WHEN @equip=equip AND @state='ПУСК' AND state='СТОП'
                   THEN @recdate
                   END next_recdate,
              CASE WHEN @equip=equip AND @state='ПУСК' AND state='СТОП'
                   THEN @rectime
                   END next_rectime,
              @recdate:=recdate,@rectime:=rectime,@equip:=equip,@state:=state
       FROM main, (SELECT @equip:='', @state:='', @recdate:='', @rectime:='') vars
       ORDER BY equip, recdate DESC, rectime DESC
     ) temp
WHERE next_recdate IS NOT NULL



fiddle
...
Рейтинг: 0 / 0
Вложенный SELECT
    #39888378
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если потребуется ограничить выборку неким интервалом времени либо списком оборудования - добавить соотв. WHERE в подзапрос.
...
Рейтинг: 0 / 0
Вложенный SELECT
    #39888788
romserg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina
Эх, старенький сервер-то.

Это из Денвера.
...
Рейтинг: 0 / 0
Вложенный SELECT
    #39888865
L_I_IG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
 select * from (select *, (select min(num) from machine_log where equip =m1.equip and num>m1.num and state = 'STAR' ) usl from machine_log m1 where state = 'STOP')m1 left join machine_log m2 on m1.usl = m2.num;
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вложенный SELECT
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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