Size: a a a

2020 November 23

OM

Oleg Makarikhin in MySQL
а  сколько вернёт
select count(1) 
FROM   products
WHERE  ( `status` = ?
        AND date_available <= ? )
      AND type <> ?
      AND products.id IN (SELECT product_id
                          FROM   product_to_categories
                          WHERE  category_id = ?)
источник

S

Syntax Highlight Bot in MySQL
Oleg Makarikhin
а  сколько вернёт
select count(1) 
FROM   products
WHERE  ( `status` = ?
        AND date_available <= ? )
      AND type <> ?
      AND products.id IN (SELECT product_id
                          FROM   product_to_categories
                          WHERE  category_id = ?)
источник

IZ

Ilia Zviagin in MySQL
Vitaliy Sheverov
одна из всегда есть
Да хер знает как быстрее с такими подзапросами...

ВОТ условие кореляции твой:

IF(products.type = 2, product_id IN (SELECT id FROM products WHERE main_id = products.id),  product_id = products.id)


я б за такое просто уволнял...
источник

S

Syntax Highlight Bot in MySQL
Ilia Zviagin
Да хер знает как быстрее с такими подзапросами...

ВОТ условие кореляции твой:

IF(products.type = 2, product_id IN (SELECT id FROM products WHERE main_id = products.id),  product_id = products.id)


я б за такое просто уволнял...
источник

IZ

Ilia Zviagin in MySQL
Ilia Zviagin
Да хер знает как быстрее с такими подзапросами...

ВОТ условие кореляции твой:

IF(products.type = 2, product_id IN (SELECT id FROM products WHERE main_id = products.id),  product_id = products.id)


я б за такое просто уволнял...
Так нельзя делать. ВОт никогда. Это комбинационный взрыв сразу
источник

VS

Vitaliy Sheverov in MySQL
Ilia Zviagin
Так нельзя делать. ВОт никогда. Это комбинационный взрыв сразу
да вот и я опнимаю что там ж;па, но как изменить пока не вижу
источник

IZ

Ilia Zviagin in MySQL
Ilia Zviagin
Да хер знает как быстрее с такими подзапросами...

ВОТ условие кореляции твой:

IF(products.type = 2, product_id IN (SELECT id FROM products WHERE main_id = products.id),  product_id = products.id)


я б за такое просто уволнял...
Распиши это через CASE и два подзапроса, а не один коррелированый с охеренно дерьмовым условием.
Может поможет.
источник

VS

Vitaliy Sheverov in MySQL
Ilia Zviagin
Распиши это через CASE и два подзапроса, а не один коррелированый с охеренно дерьмовым условием.
Может поможет.
делаю
источник

IZ

Ilia Zviagin in MySQL
я написал
источник

IZ

Ilia Zviagin in MySQL
Vitaliy Sheverov
делаю
Ну и тут у тебя нигде алиасов нет, DDL нет, тоже не понятно откуда какое поле...
источник

IZ

Ilia Zviagin in MySQL
Я так не могу что-то ещё сказать.
источник

OM

Oleg Makarikhin in MySQL
Vitaliy Sheverov
Ребята, есть ли возможность улучшить этот запрос?

select id, IF(currency_code = 'UAH', (vendor_price / 1), IF(currency_code = 'USD', (vendor_price / 0.037), vendor_price)) as vendor_price, (select IF(currency_code = 'UAH', (price / 1), IF(currency_code = 'USD', (price / 0.037), price)) as price from product_specials where (`user_group_id` = ? and date_start < ?) and (`date_end` > ? or date_end is null) and IF(products.type = 2, product_id IN (SELECT id FROM products WHERE main_id = products.id),  product_id = products.id)) as special, (select IF(currency_code = 'UAH', (price / 1), IF(currency_code = 'USD', (price / 0.037), price)) as price from product_discounts where (`user_group_id` = ? and date_start < ? and quantity = ?) and (`date_end` > ? or date_end is null) and IF(products.type = 2, product_id IN (SELECT id FROM products WHERE main_id = products.id),  product_id = products.id)) as discount from products where (`status` = ? and date_available <= ?) and type <> ? and products.id in (select product_id from product_to_categories where category_id = ?)

кажется IF(products.type = 2, product_id IN (SELECT id FROM products WHERE main_id = products.id),  product_id = products.id) очень проблемное место
мне кажется что местами можно использовать одну и туже таблицу в from (или join) и им присваивать алиасы, и использовать их вместо подзапросов.
потому что подзапросы для некоторых одинаковых условий возможно будет выполняться повторно
источник

OM

Oleg Makarikhin in MySQL
может ты про это не знаешь.или джоинить боишься)
источник

VS

Vitaliy Sheverov in MySQL
Oleg Makarikhin
мне кажется что местами можно использовать одну и туже таблицу в from (или join) и им присваивать алиасы, и использовать их вместо подзапросов.
потому что подзапросы для некоторых одинаковых условий возможно будет выполняться повторно
для specials и discounts одно и тоже условие
источник

IZ

Ilia Zviagin in MySQL
Oleg Makarikhin
мне кажется что местами можно использовать одну и туже таблицу в from (или join) и им присваивать алиасы, и использовать их вместо подзапросов.
потому что подзапросы для некоторых одинаковых условий возможно будет выполняться повторно
Ну, по крайней мере можно было бы писать через CTE, всяко было бы понятнее
источник

IZ

Ilia Zviagin in MySQL
Про "можно ли джойнить" — отдельный разговор, может и нельзя, надо схему бд знать
источник

VS

Vitaliy Sheverov in MySQL
Ilia Zviagin
Про "можно ли джойнить" — отдельный разговор, может и нельзя, надо схему бд знать
продукт с type = 2, может иметь много продуктов с type = 3, это как дочерние
источник

IZ

Ilia Zviagin in MySQL
Vitaliy Sheverov
да вот и я опнимаю что там ж;па, но как изменить пока не вижу
Вот там все твои подзапросы должны (ОБЯЗАНЫ) возвращать ровно одно единственное значение, одну строку.

Такие подзапросы (если всё нормально) должны по идее быстро работать.
Ну вот и напиши их так, чтобы они были простыми и каждый раз по индексу ходили.
источник

IZ

Ilia Zviagin in MySQL
Vitaliy Sheverov
продукт с type = 2, может иметь много продуктов с type = 3, это как дочерние
Ладно, успехов
источник

VS

Vitaliy Sheverov in MySQL
пишу
источник