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

Таблиц несколько, но для упрощения привожу пример для одной таблице:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE TABLE xTable (goods_id INT, goods_amount INT, docdate DATETIME, docOrderInDateGroup INT);
INSERT INTO xTable 
        (goods_id, goods_amount, docdate, docOrderInDateGroup)
VALUES
 	(1, 1000, '2012-05-20 15:14:00', 0),
	(2, 2500, '2012-05-20 15:25:00', 2),
 	(2, 4000, '2012-05-20 15:27:00', 3),
 	(2, 2300, '2012-05-20 15:25:00', 4),
	(2, 1250, '2012-05-20 15:25:00', 1),
	(2, 1200, '2012-05-20 15:25:00', 0),
	(4, 7500, '2012-05-20 15:30:00', 0),
 	(5, 8400, '2012-05-20 15:26:00', 0),	
	(3, 9000, '2012-05-20 15:56:00', 2),
	(3,  105, '2012-05-20 15:56:00', 3),
	(3, 1100, '2012-05-20 15:52:00', 1),
 	(3,  204, '2012-05-20 15:56:00', 0);



хочу получить goods_amount для всех goods_id у которых максимальны две колонки docdate и docOrderInDateGroup

в случае примера хочу результат:
Код: sql
1.
2.
3.
4.
5.
6.
7.
| goods_id | goods_amount |      docdate          | docOrderInDateGroup |
|----------|--------------|-----------------------|---------------------|
|        1 |         1000 | '2012-05-20 15:14:00' |                   0 |
|        2 |         4000 | '2012-05-20 15:27:00' |                   3 |
|        4 |         7500 | '2012-05-20 15:30:00' |                   0 |
|        5 |         8400 | '2012-05-20 15:26:00' |                   0 |
|        3 |          105 | '2012-05-20 15:56:00' |                   3 |



Дошел до такого запроса но дальше не смог:
Код: sql
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.
SELECT aa.goods_id, aa.goods_amount, aa.docdate, aa.docOrderInDateGroup
	FROM	xTable aa 
	INNER JOIN
	(
		SELECT		docdate, MAX(docOrderInDateGroup) maxOrder
		FROM		xTable
		GROUP BY    docdate
	) b ON 	aa.docdate = b.docdate 
		 AND	aa.docOrderInDateGroup = b.maxOrder
INNER JOIN
(
	SELECT	a.goods_id, MAX(a.docdate) maxArrivede
	FROM	xTable a 
	INNER JOIN

		(
			SELECT		docdate, MAX(docOrderInDateGroup) maxOrder
			FROM		xTable
			GROUP BY    docdate
		) b ON 	a.docdate = b.docdate 
			 AND	a.docOrderInDateGroup = b.maxOrder

	GROUP BY a.goods_id

) bb ON 	aa.goods_id = bb.goods_id 
	 AND	aa.docdate = bb.maxArrivede



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

Помогите если можно.
Спасибо!
...
Рейтинг: 0 / 0
Снизить derived таблицы в запросе
    #38578137
Avtopic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Удалось убрать один INNER JOIN

хотя советы форума опять приветствуются.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT aa.goods_id, aa.goods_amount, aa.docdate, aa.docOrderInDateGroup
FROM	xTable aa 

INNER JOIN
(	 
	SELECT	a.goods_id, MAX(a.docdate) maxArrivede, b.maxOrder
	FROM	xTable a 

	INNER JOIN
	(
		SELECT		docdate, MAX(docOrderInDateGroup) maxOrder
		FROM		xTable
		GROUP BY    docdate
	) b ON 	a.docdate = b.docdate AND	a.docOrderInDateGroup = b.maxOrder

	GROUP BY a.goods_id
) bb ON aa.goods_id = bb.goods_id 
		AND	aa.docdate = bb.maxArrivede	 
		AND	aa.docOrderInDateGroup = bb.maxOrder	 
...
Рейтинг: 0 / 0
Снизить derived таблицы в запросе
    #38578413
Avtopic,

F.A.Q. по теме уже читал? Но в целом, твою задачу вообще можно решить без каких бы то ни было derived-таблиц, одним линейным агрегатным запросом... :)
...
Рейтинг: 0 / 0
Снизить derived таблицы в запросе
    #38579142
nwarap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
select * from xtable x1
where (select max(x2.docdate) from xtable x2 where x2.goods_id=x1.goods_id) = x1.docdate
and (select max(x3.docOrderInDateGroup) from xtable x3 where x3.goods_id=x1.goods_id and x3.docdate=x1.docdate) =  x1.docOrderInDateGroup
group by x1.goods_id



|| *id* || *select_type* || *table* || *type* || *possible_keys* || *key* || *key_len* || *ref* || *rows* || *Extra* ||
|| 1 || PRIMARY || x1 || ALL || || || || || 12 || Using where; Using temporary; Using filesort ||
|| 3 || DEPENDENT SUBQUERY || x3 || ALL || || || || || 12 || Using where ||
|| 2 || DEPENDENT SUBQUERY || x2 || ALL || || || || || 12 || Using where ||


Пробуй.
...
Рейтинг: 0 / 0
Снизить derived таблицы в запросе
    #38579165
nwarap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поспешил.

Код: sql
1.
2.
3.
select * from xtable x1
where (select max(x2.docOrderInDateGroup) from xtable x2 where x2.goods_id=x1.goods_id and x2.docdate=x1.docdate) =  x1.docOrderInDateGroup
group by x1.goods_id
...
Рейтинг: 0 / 0
Снизить derived таблицы в запросе
    #38579241
Avtopic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - ЭхAvtopic,

F.A.Q. по теме уже читал? Но в целом, твою задачу вообще можно решить без каких бы то ни было derived-таблиц, одним линейным агрегатным запросом... :)
И, где вы видите там похожую задачу?

Мне надо выборка по максимуму одной колонки, в котором еще нужно выбрать по максимуму из другой колонки


nwarapПоспешил.

Код: sql
1.
2.
3.
select * from xtable x1
where (select max(x2.docOrderInDateGroup) from xtable x2 where x2.goods_id=x1.goods_id and x2.docdate=x1.docdate) =  x1.docOrderInDateGroup
group by x1.goods_id



Здесь нет условия для максимального docdate
...
Рейтинг: 0 / 0
Снизить derived таблицы в запросе
    #38579364
nwarap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
попробуйте мой первый вариант

AvtopicДобрый Э - ЭхAvtopic,

F.A.Q. по теме уже читал? Но в целом, твою задачу вообще можно решить без каких бы то ни было derived-таблиц, одним линейным агрегатным запросом... :)
И, где вы видите там похожую задачу?

Мне надо выборка по максимуму одной колонки, в котором еще нужно выбрать по максимуму из другой колонки


nwarapПоспешил.

Код: sql
1.
2.
3.
select * from xtable x1
where (select max(x2.docOrderInDateGroup) from xtable x2 where x2.goods_id=x1.goods_id and x2.docdate=x1.docdate) =  x1.docOrderInDateGroup
group by x1.goods_id



Здесь нет условия для максимального docdate
...
Рейтинг: 0 / 0
Снизить derived таблицы в запросе
    #38579389
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(sq.data, ',', -2), ',', 1) goods_id,
       SUBSTRING_INDEX(sq.data, ',', -1) goods_amount, 
       SUBSTRING_INDEX(sq.data, ',', 1) docdate, 
       SUBSTRING_INDEX(SUBSTRING_INDEX(sq.data, ',', 2), ',', -1) docOrderInDateGroup
FROM   (
       SELECT MAX(CONCAT_WS(',', docdate, docOrderInDateGroup, goods_id, goods_amount)) data
       FROM xTable
       GROUP BY goods_id
       ) sq
ORDER BY 1 ASC;
...
Рейтинг: 0 / 0
Снизить derived таблицы в запросе
    #38579438
Avtopic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nwarap , Спасибо!
ваш запрос работает правильно, но

Вот это ваш запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SELECT x1.goods_id, x1.goods_amount, x1.docdate, x1.docOrderInDateGroup
xtable x1

WHERE 
(
	SELECT max(x2.docdate) FROM 
	xtable x2 
	where x2.goods_id=x1.goods_id
) = x1.docdate

and (
	SELECT max(x3.docOrderInDateGroup) FROM 
	xtable x3 
	where x3.goods_id=x1.goods_id and x3.docdate=x1.docdate
) =  x1.docOrderInDateGroup

group by x1.goods_id



а, вот это мой
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT aa.goods_id, aa.goods_amount, aa.docdate, aa.docOrderInDateGroup
FROM	xTable aa 

INNER JOIN
(
	SELECT	a.goods_id, MAX(a.docOrderInDateGroup) maxOrder, b.maxArrivede
	FROM	xTable a 
	
	INNER JOIN
	(	
		SELECT		goods_id, MAX(docdate) maxArrivede
		FROM		xTable
		GROUP BY    goods_id		
	) b ON 	a.goods_id = b.goods_id AND	a.docdate = b.maxArrivede
  GROUP BY a.goods_id

) bb ON aa.goods_id = bb.goods_id 
		AND	aa.docdate = bb.maxArrivede	 
		AND	aa.docOrderInDateGroup = bb.maxOrder	



разница между ними только то, что
derived таблицы в моем запросе,
заменились на SUBQUERY в вашем, что не лучше а хуже.

// ------------------

Akina , Спасибо!
проверю как работает по быстроте из-за используемых текстовых функции.
...
Рейтинг: 0 / 0
Снизить derived таблицы в запросе
    #38579501
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Avtopicпроверю как работает по быстроте из-за используемых текстовых функции.Это шаблон. В реальном запросе следует внести под-подзапрос, отбирающий строго нужный пул и делающий пред-отбор по первому полю сортировки.
...
Рейтинг: 0 / 0
Снизить derived таблицы в запросе
    #38579657
AvtopicИ, где вы видите там похожую задачу?Твоя задача и Ф.А.К. - один в один. Количество критериев отбора первой-последней строки влияет лишь на количество и вид условий, но не на алгоритм решения задачи. А наиболее распространенные алгоритмы в том Ф.А.К.е как раз и описаны. Если ты этого не видишь, то мне остается лишь посочувствовать тебе.

З.Ы.
Однопроходный вариант без подзапросов и деривед-таблиц даже приводить не буду, боюсь твой мозг не вынесет такого насилия над ним.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Снизить derived таблицы в запросе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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