Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Помогите разобраться с AND EXISTS
|
|||
|---|---|---|---|
|
#18+
Есть запросы, не понимаю зачем там AND EXISTS и как он работает Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Хочу его ускорить. правильно ли его будет переписать примерно так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. По полям p2a0.text есть индекс p2a0.text_id в другой таблице, соответственно хочу чтобы все работало не через поиск по тексту, а через индекс, поэтому в последствии AND (p2a1.text = 'накладные' OR p2a1.text..... Преобразую в AND p2a1.text_id = XXX И вот тут можно и INNER JOIN написать, ничего я так понимаю не поменяется? LEFT JOIN oc_product_attribute p2a0 ON (p2a0.product_id=p.product_id) LEFT JOIN oc_product_attribute p2a1 ON (p2a1.product_id=p.product_id) LEFT JOIN oc_product_attribute p2a2 ON (p2a2.product_id=p.product_id) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 11:58 |
|
||
|
Помогите разобраться с AND EXISTS
|
|||
|---|---|---|---|
|
#18+
Переписал вот так, но стало в 2 раза дольше выполняться, хотя результат вроде как верный: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 12:42 |
|
||
|
Помогите разобраться с AND EXISTS
|
|||
|---|---|---|---|
|
#18+
Евгений57, JOIN-ы множат записи в результате, если искомых записей в подсоединяемой таблице более одного. EXISTS найдет одну запись и упокоится, а JOIN вытащит их все, затем вы из DISTINCT-ом будете сводить обратно в одну. Кроме того, то версии MySQL 5.6 конструкция IN (SELECT ...) работает очень долго из-за многократного выполнения подзапроса. И, кстати, DISTINCT внутри него смысла не имеет, но может увеличивать время работы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 12:47 |
|
||
|
Помогите разобраться с AND EXISTS
|
|||
|---|---|---|---|
|
#18+
Объясните как это работает: LEFT JOIN oc_product_attribute p2a ON (p2a.product_id=p.product_id) WHERE p2a.attribute_id IS NOT NULL AND EXISTS (select 1 FROM oc_product_attribute p2a0 WHERE p2a0.product_id=p2a.product_id AND p2a0.attribute_id = 20 AND (p2a0.text = '2х36 Вт' OR p2a0.text like '2х36 Вт:%' OR p2a0.text like '%:2х36 Вт' OR p2a0.text like '%:2х36 Вт:%')) Мы цепляем таблицу p2a у которой attribute_id IS NOT NULL И что???? с одной стороны select 1 то есть результатов выборки нет, точнее одни единицы. с другой стороны p2a0.product_id=p2a.product_id - цепляет p2a по product_id как-то и плюс условия по text и product_id. Если WHERE p2a.attribute_id цепляет атрибуты по [select * FROM oc_product_attribute p2a0 WHERE p2a0.product_id=p2a.product_id AND p2a0.attribute_id = 20 AND (p2a0.text = '2х36 Вт' OR p2a0.text like '2х36 Вт:%' OR p2a0.text like '%:2х36 Вт' OR p2a0.text like '%:2х36 Вт:%'))] то почему не написали просто WHERE p2a.attribute_id IS NOT NULL AND (p2a.attribute_id = 20 OR p2a.attribute_id = 22...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 13:37 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=47&tid=1830885]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
2ms |
| others: | 13ms |
| total: | 131ms |

| 0 / 0 |
