Проблема, очевидно, в вашем состоянии JOIN. Используемая вами оптимизация (применение условия к базовой таблице) имеет смысл, когда вас интересуют результаты внутреннего соединения, но в случае внешнего JOIN это читается следующим образом: находите соответствия между строками content
и activity_log
, когда идентификатор содержимого совпадает и идентификатор сеанса совпадает, и возвращает пустые значения для строк activity_log
, когда либо отсутствует журнал для идентификатора содержимого, либо отсутствует идентификатор содержимого, но идентификатор сеанса не соответствует указанному . И это вряд ли то, что вы хотите.
Ваш запрос должен выглядеть следующим образом:
SELECT content.*, activity_log.content_id
FROM (
SELECT *
FROM content
WHERE sess_id = '$sess_id'
AND visibility = $visibility
AND file_ready = 1
AND reported < ".REPORTED_LIMIT."
) as content
LEFT JOIN activity_log
ON content.id = activity_log.content_id
WHERE activity_log.content_id IS NULL
LIMIT 1;
Если производительность не оптимальна, вы можете рассмотреть возможность создания составного индекса (sess_id, видимость, fileready, сообщил).