Ошибка в поиске покупателей

Появилась ошибка в поиске покупателей
Query Error
Query: SELECT SQL_CALC_FOUND_ROWS sc.*, c.*, o.create_datetime AS last_order_datetime
FROM wa_contact AS c
JOIN shop_customer AS sc
ON c.id=sc.contact_id
LEFT JOIN shop_order AS o
ON o.id=sc.last_order_id
LEFT JOIN wa_contact_emails AS e ON e.contact_id=c.id
LEFT JOIN wa_contact_data AS p ON p.contact_id=c.id AND p.field="phone"
WHERE (CONCAT(c.name, ' ', IFNULL(e.email, ''), ' ', IFNULL(p.value, '')) LIKE '%шты%')
GROUP BY c.id
ORDER BY c.name
LIMIT 0, 10
Error: 1104
Message: The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay

Please contact app developer.
Думаю, что это связано с вызова хелпера. Не знаю в каком файле его установить?

4 ответа

  • 0
    Михаил Ушенин Webasyst 11 октября 2013 01:13 #
    Попробуйте обратиться к хостинг-провайдеру с просьбой увеличить значение параметра SQL_MAX_JOIN_SIZE в конфигурации MySQL-сервера.
  • 0
    mstak 11 октября 2013 04:05 #
    Вот ответ хостинга
    Данное значение установлено 1,000,000 (1 миллион) и это и так большое значение. Увеличение его не планируется на виртуальном хостинге
    Как теперь быть?
  • 0
    Леонид Вакуленко Webasyst 11 октября 2013 09:57 #
    MySQL в некоторых случаях неправильно оценивает сложность запроса и отказывается его выполнять. В данном случае проблему могут создавать либо таблица wa_contact_emails, либо wa_contact_data (оттуда запрос берёт телефоны).

    Есть способы этому помочь. Самое простое - выполнить SQL:

    OPTIMIZE TABLE `wa_contact_emails`, `wa_contact_data`

    Это должно (на какое-то время) помочь MySQL корректнее оценивать сложность запросов с этими таблицами. Попробуйте в первую очередь.

    Второй способ предполагает модификацию исходного кода. Обновление приложения через инсталлер перезапишет модификацию, и поиск сломается опять. Поэтому такая практика настоятельно не рекомендуется. Но так или иначе, это возможно: можно переписать проблемный SQL запрос, чтобы он лучше использовал индексы. В данном случае можно ограничить поиск по телефонам и Email'ам только главной (первой) записью.

    В shopCustomer.model.php найти в районе 53 строки:

    $join[] = 'LEFT JOIN wa_contact_emails AS e ON e.contact_id=c.id';
    $join[] = 'LEFT JOIN wa_contact_data AS p ON p.contact_id=c.id AND p.field="phone"';

    Заменить на:

    $join[] = 'LEFT JOIN wa_contact_emails AS e ON e.contact_id=c.id AND e.sort=0';
    $join[] = 'LEFT JOIN wa_contact_data AS p ON p.contact_id=c.id AND p.field="phone" AND p.sort=0';
    • 0
      mstak mstak 16 октября 2013 00:41 #
      Почистил базу данных покупателей и выполнил запрос SQL. Помогло.
      Спасибо

Добавить ответ

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