SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

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

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

Вы не зашли.

#1 14.02.2012 17:51:59

simple
Активист
Зарегистрирован: 25.11.2010
Сообщений: 168

Помогите с запросом SELECT GROUP BY

Добрый день, мучаюсь с запросом на выборку данных из таблицы сделок, нужно выбрать сгруппированные данные по контрактам, например последняя сделка, лот в последней, время последней, первая сделка, максимальная, минимальная и.т.д вот схема таблицы:


CREATE TABLE `USERS_TRANSACTIONS` (
    `ID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `CONTRACT_ID` TINYINT UNSIGNED NOT NULL,
    `TYPE` ENUM('BUY','SELL') NOT NULL,
    `PRICE` SMALLINT UNSIGNED NOT NULL,
    `AMOUNT` SMALLINT UNSIGNED NOT NULL,
    `TIME` TIME NOT NULL,
    `NUMBER` TINYINT UNSIGNED NOT NULL,
    PRIMARY KEY (`ID`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
ROW_FORMAT=DEFAULT
 


Сам додумался пока только до такого запроса:

SELECT
`CONTRACT_ID` AS `CONTRACT`,
(SELECT `PRICE` FROM USERS_TRANSACTIONS ORDER BY `ID` DESC LIMIT 1) AS `LAST`,
(SELECT `AMOUNT` FROM USERS_TRANSACTIONS ORDER BY `ID` DESC LIMIT 1) AS `LOT`,
(SELECT `TIME` FROM USERS_TRANSACTIONS ORDER BY `ID` DESC LIMIT 1) AS `TIME`,
`PRICE` AS `OPEN`,
MAX(PRICE) AS `HIGH`,
MIN(PRICE) AS `LOW`,
SUM(NUMBER) AS `DEALS`,
SUM(AMOUNT) AS `CONTRACTS` FROM USERS_TRANSACTIONS GROUP BY `CONTRACT_ID`
 

Но он начинает работает не корректно по отношению к выборке последних сделок,лотов и времени если в таблицы оказывается несколько видов контрактов(в последние сделки запрос пишет просто последние записи по ID и не важно какому контракту принадлежит сделка), помогите решить эту проблему, сойдет решение любой сложности (в пределах разумного конечно) так как запрос будет выполнятся всего лишь один раз, при запуске сервера.

Отредактированно simple (14.02.2012 18:04:52)

Неактивен

 

#2 14.02.2012 19:08:18

simple
Активист
Зарегистрирован: 25.11.2010
Сообщений: 168

Re: Помогите с запросом SELECT GROUP BY

Дошло до меня...


SELECT T1.SYMBOL AS `КОНТРАКТ`,
       T2.PRICE AS `ПОСЛЕДНЯЯ СДЕЛКА`,
       T2.AMOUNT AS `ЛОТОВ В ПОСДЕДНЕЙ СДЕЛКИ`,
       T2.`TIME` AS `ВРЕМЯ ПОСЛЕДНИЙ СДЕЛКИ`,
       T1.PRICE AS `ЦЕНА ОТКРЫТИЯ`,
       MAX(T1.PRICE) AS `МАКСИМАЛЬНАЯ ЦЕНА`,
       MIN(T1.PRICE) AS `МИНИМАЛЬНАЯ ЦЕНА`,
       SUM(T1.NUMBER) AS `ВСЕГО СДЕЛОК`,
       SUM(T1.AMOUNT) AS `ВСЕГО ЛОТОВ`
FROM USERS_TRANSACTIONS T1
INNER JOIN (SELECT SYMBOL,PRICE,`TIME`,AMOUNT FROM USERS_TRANSACTIONS GROUP BY SYMBOL DESC) AS T2 ON T2.SYMBOL = T1.SYMBOL
GROUP BY T1.SYMBOL ORDER BY NULL;
 

Все работает как надо сейчас, за исключением что сами контракты выводятся по убыванию, а хотелось бы в том порядке в каком они находятся в таблице,т.е по возрастанию, ну это конечно мелочи, но все же можно еще как нибудь оптимизировать данный запрос?

Отредактированно simple (14.02.2012 19:11:13)

Неактивен

 

#3 14.02.2012 19:17:55

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

Re: Помогите с запросом SELECT GROUP BY

Ключик на поле SYMBOL в таблице USER_TRANSACTIONS однозначно не помешает.


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

Неактивен

 

#4 14.02.2012 19:31:21

simple
Активист
Зарегистрирован: 25.11.2010
Сообщений: 168

Re: Помогите с запросом SELECT GROUP BY

ключи да, они есть, это просто черновая таблица, а сам запрос можно как нибудь еще улучшить или это апогей человеческой мысли? big_smile

Неактивен

 

#5 14.02.2012 19:34:21

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

Re: Помогите с запросом SELECT GROUP BY

Если сделка - это значение из колонки `PRICE`, то

select * from
(select `CONTRACT_ID`, MAX(PRICE) AS `HIGH`,MIN(PRICE) AS `LOW`,SUM(NUMBER) AS `DEALS`,SUM(AMOUNT) AS `CONTRACTS`, max(`time`) as `время последней сделки`, min(`time`) as `время первой сделки`
FROM USERS_TRANSACTIONS GROUP BY `CONTRACT_ID`) t
join
(select `PRICE` as `последняя сделка`, `AMOUNT` as `лот в последней`, `time` from USERS_TRANSACTIONS) t1 on t.`время последней сделки`=t1.`time`
join
(select `PRICE` as `первая сделка`,`AMOUNT` as `лот в первой`, `time` from USERS_TRANSACTIONS) t2 on t.`время первой сделки`=t2.`time`;


В самом начале запроса вместо * честно перечислите все нужные поля, так как сейчас в выборке будут лишние поля, например время будет дублироваться.

Неактивен

 

#6 14.02.2012 21:43:43

simple
Активист
Зарегистрирован: 25.11.2010
Сообщений: 168

Re: Помогите с запросом SELECT GROUP BY

спасибо, попробую

Неактивен

 

Board footer

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