SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 01.07.2020 10:42:19

rutshtein
Участник
Зарегистрирован: 01.07.2020
Сообщений: 4

Помогите составить запрос

Есть таблица показаний приборов учета indication, в ней поля
id
ls - лицевой счет
hvs - показания ХВС
gvs - показания ГВС
en - показания ЭЭ
date - дата показаний

Нужно сделать выборку, чтобы в ней отразились текущие показания и предыдущие показания по одному лицевому счету

Помогите составить запрос. Составленный запрос не работает, ошибка Operand should contain 1 column(s). Т.е. во втором SELECT если выбрать одно поле, то работает, но мне нужно выбрать несколько.

SELECT id AS cur_id, ls AS cur_ls, hvs, gvs, en, date, (SELECT hvs, gvs, en, date FROM indication WHERE ls=cur_ls AND id<cur_id ORDER BY date DESC LIMIT 1) FROM indication WHERE date>=1593543600 AND date<=1596221999 ORDER BY date DESC

Неактивен

 

#2 01.07.2020 10:48:42

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 411

Re: Помогите составить запрос

Используйте оконные функции если версия MySql позволяет
MySQL поддерживает оконные функции начиная с версии 8.0

Отредактированно klow (01.07.2020 10:49:19)

Неактивен

 

#3 01.07.2020 10:55:12

rutshtein
Участник
Зарегистрирован: 01.07.2020
Сообщений: 4

Re: Помогите составить запрос

klow написал:

Используйте оконные функции если версия MySql позволяет
MySQL поддерживает оконные функции начиная с версии 8.0

Спасибо за наводку, но я новичок. Можете помочь составить запрос?

Неактивен

 

#4 01.07.2020 10:58:28

rutshtein
Участник
Зарегистрирован: 01.07.2020
Сообщений: 4

Re: Помогите составить запрос

Версия: mysql-5.7.23

Неактивен

 

#5 01.07.2020 13:16:44

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Помогите составить запрос

SELECT id AS cur_id, ls AS cur_ls, hvs, gvs, en, date,
(SELECT hvs FROM indication WHERE ls=cur_ls AND id<cur_id ORDER BY date DESC LIMIT 1) as hvs_old,
(SELECT gvs FROM indication WHERE ls=cur_ls AND id<cur_id ORDER BY date DESC LIMIT 1) as gvs_old,
(SELECT en FROM indication WHERE ls=cur_ls AND id<cur_id ORDER BY date DESC LIMIT 1) as en_old,
(SELECT date FROM indication WHERE ls=cur_ls AND id<cur_id ORDER BY date DESC LIMIT 1) as date_old
FROM indication WHERE date>=1593543600 AND date<=1596221999 ORDER BY date DESC

Неактивен

 

#6 01.07.2020 13:32:07

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Помогите составить запрос

to, rutshtein
ваша задача - выбрать по 2 последних записи для каждого лицевого счета
см варианты решений в Выбрать несколько записей из каждой группы.

кроме того, чтобы использовать 1 подзапрос, в исходном запросе вы можете сделать
(SELECT concat(hvs, gvs, en, date) FROM
а на клиенте при обработке результата вычленять нужные значения (или по размеру величин, если он фиксирован, или используя при склейке при склейке специфические разделители)

to, klow
в 8-ке оптимальней будет использовать lateral

Неактивен

 

#7 01.07.2020 14:32:55

rutshtein
Участник
Зарегистрирован: 01.07.2020
Сообщений: 4

Re: Помогите составить запрос

vasya написал:

to, rutshtein
ваша задача - выбрать по 2 последних записи для каждого лицевого счета
см варианты решений в Выбрать несколько записей из каждой группы.

кроме того, чтобы использовать 1 подзапрос, в исходном запросе вы можете сделать
(SELECT concat(hvs, gvs, en, date) FROM
а на клиенте при обработке результата вычленять нужные значения (или по размеру величин, если он фиксирован, или используя при склейке при склейке специфические разделители)

to, klow
в 8-ке оптимальней будет использовать lateral

Там поля могут быть NULL и при CONCAT всё становится NULL

Неактивен

 

#8 01.07.2020 17:05:44

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Помогите составить запрос

ifnull() в помощь

Неактивен

 

#9 01.07.2020 17:57:18

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Помогите составить запрос

Еще можно coalesce, даже лучше, ибо  это все же стандарт ANSI, а ifnull - чисто mysql'евская фишка.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson