powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизировать запрос
8 сообщений из 8, страница 1 из 1
Оптимизировать запрос
    #38793972
Nezhnayka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Написал вот такой запрос:
Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
REPLACE wp_woocommerce_order_itemmeta(order_item_id,meta_key,meta_value)
SELECT x.order_item_id,'_qty',x.qty FROM(
	SELECT wi.order_item_id,o.system_id AS product_id, 0 AS variation_id,iu.name,iu.price,iu.qty,iu.amount,iu.num_order  FROM wp_integration_one_s_orders_items_update AS iu 
	LEFT JOIN wp_integration_one_s_objects AS o
	ON o.guid=iu.guid_object
	LEFT JOIN wp_woocommerce_order_items AS wi
	ON wi.order_id=iu.num_order AND wi.order_item_name=iu.name AND wi.order_item_type='line_item'
	WHERE iu.type='product' AND o.id IS NOT NULL
	UNION 
	SELECT wi.order_item_id,o2.system_id AS product_id, o1.system_id AS variation_id,iu.name,iu.price,iu.qty,iu.amount,iu.num_order  FROM wp_integration_one_s_orders_items_update AS iu 
	LEFT JOIN wp_integration_one_s_objects AS o1
	ON o1.guid=iu.guid_object
	LEFT JOIN wp_integration_one_s_objects AS o2
	ON o2.guid=o1.parent_guid
	LEFT JOIN wp_woocommerce_order_items AS wi
	ON wi.order_id=iu.num_order AND wi.order_item_name=iu.name AND wi.order_item_type='line_item'
	WHERE iu.type='variable' AND o1.id IS NOT NULL AND o2.id IS NOT NULL;
) AS x
UNION
SELECT x.order_item_id,'_product_id',x.product_id FROM (
	SELECT wi.order_item_id,o.system_id AS product_id, 0 AS variation_id,iu.name,iu.price,iu.qty,iu.amount,iu.num_order  FROM wp_integration_one_s_orders_items_update AS iu 
	LEFT JOIN wp_integration_one_s_objects AS o
	ON o.guid=iu.guid_object
	LEFT JOIN wp_woocommerce_order_items AS wi
	ON wi.order_id=iu.num_order AND wi.order_item_name=iu.name AND wi.order_item_type='line_item'
	WHERE iu.type='product' AND o.id IS NOT NULL
	UNION 
	SELECT wi.order_item_id,o2.system_id AS product_id, o1.system_id AS variation_id,iu.name,iu.price,iu.qty,iu.amount,iu.num_order  FROM wp_integration_one_s_orders_items_update AS iu 
	LEFT JOIN wp_integration_one_s_objects AS o1
	ON o1.guid=iu.guid_object
	LEFT JOIN wp_integration_one_s_objects AS o2
	ON o2.guid=o1.parent_guid
	LEFT JOIN wp_woocommerce_order_items AS wi
	ON wi.order_id=iu.num_order AND wi.order_item_name=iu.name AND wi.order_item_type='line_item'
	WHERE iu.type='variable' AND o1.id IS NOT NULL AND o2.id IS NOT NULL
) AS x
UNION
SELECT x.order_item_id,'_variation_id',x.variation_id FROM (
	SELECT wi.order_item_id,o.system_id AS product_id, 0 AS variation_id,iu.name,iu.price,iu.qty,iu.amount,iu.num_order  FROM wp_integration_one_s_orders_items_update AS iu 
	LEFT JOIN wp_integration_one_s_objects AS o
	ON o.guid=iu.guid_object
	LEFT JOIN wp_woocommerce_order_items AS wi
	ON wi.order_id=iu.num_order AND wi.order_item_name=iu.name AND wi.order_item_type='line_item'
	WHERE iu.type='product' AND o.id IS NOT NULL
	UNION 
	SELECT wi.order_item_id,o2.system_id AS product_id, o1.system_id AS variation_id,iu.name,iu.price,iu.qty,iu.amount,iu.num_order  FROM wp_integration_one_s_orders_items_update AS iu 
	LEFT JOIN wp_integration_one_s_objects AS o1
	ON o1.guid=iu.guid_object
	LEFT JOIN wp_integration_one_s_objects AS o2
	ON o2.guid=o1.parent_guid
	LEFT JOIN wp_woocommerce_order_items AS wi
	ON wi.order_id=iu.num_order AND wi.order_item_name=iu.name AND wi.order_item_type='line_item'
	WHERE iu.type='variable' AND o1.id IS NOT NULL AND o2.id IS NOT NULL
) AS x



Соответственно не нравится, что несколько раз повторяется этот код:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
	SELECT wi.order_item_id,o.system_id AS product_id, 0 AS variation_id,iu.name,iu.price,iu.qty,iu.amount,iu.num_order  FROM wp_integration_one_s_orders_items_update AS iu 
	LEFT JOIN wp_integration_one_s_objects AS o
	ON o.guid=iu.guid_object
	LEFT JOIN wp_woocommerce_order_items AS wi
	ON wi.order_id=iu.num_order AND wi.order_item_name=iu.name AND wi.order_item_type='line_item'
	WHERE iu.type='product' AND o.id IS NOT NULL
	UNION 
	SELECT wi.order_item_id,o2.system_id AS product_id, o1.system_id AS variation_id,iu.name,iu.price,iu.qty,iu.amount,iu.num_order  FROM wp_integration_one_s_orders_items_update AS iu 
	LEFT JOIN wp_integration_one_s_objects AS o1
	ON o1.guid=iu.guid_object
	LEFT JOIN wp_integration_one_s_objects AS o2
	ON o2.guid=o1.parent_guid
	LEFT JOIN wp_woocommerce_order_items AS wi
	ON wi.order_id=iu.num_order AND wi.order_item_name=iu.name AND wi.order_item_type='line_item'
	WHERE iu.type='variable' AND o1.id IS NOT NULL AND o2.id IS NOT NULL


Подскажите пожалуйста, как можно оптимизировать этот момент?
...
Рейтинг: 0 / 0
Оптимизировать запрос
    #38794002
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не вижу насколько точно повторяется этот фрагмент. Если повторяется абсолютно точно за исключением констант для поля meta_key, то их можно убрать внутрь этого фрагмента:
Код: sql
1.
2.
3.
4.
5.
(SELECT '_qty' meta_key
UNION ALL
SELECT '_product_id' meta_key
UNION ALL
SELECT'_variation_id' meta_key) t

И сделать с этим фрагментом декартово произведение.

И, кстати, не надо использовать UNION, где правильнее и логичнее использовать UNION ALL. Т.к. просто UNION значительно более трудоемок.
...
Рейтинг: 0 / 0
Оптимизировать запрос
    #38794011
Nezhnayka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>> Если повторяется абсолютно точно за исключением констант для поля meta_key, то их можно убрать внутрь этого фрагмента:

Нет, отличаются не только значениями поля meta_key, но и значениями поля meta_value, которые берутся так-же из этого фрагмента.
...
Рейтинг: 0 / 0
Оптимизировать запрос
    #38794020
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nezhnayka>> Если повторяется абсолютно точно за исключением констант для поля meta_key, то их можно убрать внутрь этого фрагмента:

Нет, отличаются не только значениями поля meta_key, но и значениями поля meta_value, которые берутся так-же из этого фрагмента.А, ну это несложно поправить:
Код: sql
1.
2.
3.
4.
SELECT x.order_item_id,
  t.meta_key, 
  CASE WHEN t.meta_key='_qty' THEN x.qty WHEN ... THEN ... WHEN ... THEN ... END meta_value
FROM ...
...
Рейтинг: 0 / 0
Оптимизировать запрос
    #38794038
Nezhnayka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вроде понятно, а можете показать, как полностью это должно выглядеть? Спасибо.
...
Рейтинг: 0 / 0
Оптимизировать запрос
    #38794063
Nezhnayka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вроде сделал, так должно быть видимо:
Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
SELECT x.order_item_id,x.meta_key,CASE WHEN x.meta_key='_qty' THEN x.qty WHEN x.meta_key='_product_id' THEN x.product_id WHEN x.meta_key='_variation_id' THEN x.variation_id END meta_value
FROM (
	SELECT t.meta_key,wi.order_item_id,o.system_id AS product_id, 0 AS variation_id,iu.name,iu.price,iu.qty,iu.amount,iu.num_order  FROM wp_integration_one_s_orders_items_update AS iu 
	LEFT JOIN wp_integration_one_s_objects AS o
	ON o.guid=iu.guid_object
	LEFT JOIN wp_woocommerce_order_items AS wi
	ON wi.order_id=iu.num_order AND wi.order_item_name=iu.name AND wi.order_item_type='line_item'
	CROSS JOIN (
		SELECT '_qty' meta_key
		UNION ALL
		SELECT '_product_id' meta_key
		UNION ALL
		SELECT'_variation_id' meta_key
	) t
	WHERE iu.type='product' AND o.id IS NOT NULL
	
	UNION ALL
	
	SELECT t.meta_key,wi.order_item_id,o2.system_id AS product_id, o1.system_id AS variation_id,iu.name,iu.price,iu.qty,iu.amount,iu.num_order  FROM wp_integration_one_s_orders_items_update AS iu 
	LEFT JOIN wp_integration_one_s_objects AS o1
	ON o1.guid=iu.guid_object
	LEFT JOIN wp_integration_one_s_objects AS o2
	ON o2.guid=o1.parent_guid
	LEFT JOIN wp_woocommerce_order_items AS wi
	ON wi.order_id=iu.num_order AND wi.order_item_name=iu.name AND wi.order_item_type='line_item'
	CROSS JOIN (
		SELECT '_qty' meta_key
		UNION ALL
		SELECT '_product_id' meta_key
		UNION ALL
		SELECT'_variation_id' meta_key
	) t
	WHERE iu.type='variable' AND o1.id IS NOT NULL AND o2.id IS NOT NULL
) AS x


Еще раз спасибо!
...
Рейтинг: 0 / 0
Оптимизировать запрос
    #38794067
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nezhnayka,

Еще попробуйте подзапрос с тремя константами не прятать так глубоко, а приджойнить уже после UNION ALL. Не могу сходу сказать как будет быстрее.

Еще непонятно - o1.id IS NOT NULL AND o2.id IS NOT NULL не сочетается с LEFT JOIN этих таблиц. Либо условие лишнее, либо слово LEFT лишнее.
...
Рейтинг: 0 / 0
Оптимизировать запрос
    #38794074
Nezhnayka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftЕще попробуйте подзапрос с тремя константами не прятать так глубоко, а приджойнить уже после UNION ALL.

ок, попробую, но уже наверное завтра.

miksoftЕще непонятно - o1.id IS NOT NULL AND o2.id IS NOT NULL не сочетается с LEFT JOIN этих таблиц. Либо условие лишнее, либо слово LEFT лишнее.

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


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