Использование таблицы с псевдонимами в нескольких подготовленных выражениях PDO - PullRequest
0 голосов
/ 07 ноября 2011

Из-за необходимости объединения нескольких таблиц в одном запросе я не могу использовать SQL_CALC_FOUND_ROWS (или LIMIT) для внешнего запроса (число будет больше, чем ожидалось).

Вот идеальный запрос, если MySQL поддерживает использование SQL_CALC_FOUND_ROWS в подзапросах:

SELECT events.*, bands.*
    FROM events
        LEFT JOIN bands ON events.event_id = bands.event_id
    WHERE e.event_id IN (
            SELECT * FROM (
                SELECT SQL_CALC_FOUND_ROWS e.event_id
                    FROM events
                    WHERE events.date > NOW()
                    ORDER BY events.date ASC LIMIT 0, 25
            ) ALIAS
    )
ORDER BY events.date ASC

Этот вопрос предлагает создать таблицу с псевдонимами, но я не уверен, что смогу это сделатьс подготовленными инструкциями PDO.

Я попытался это сделать, но получил ошибку синтаксического анализа, поскольку FOUND_EVENTS интерпретировалось как (несуществующее) имя столбца:

$st1 = $pdo->prepare("(SELECT SQL_CALC_FOUND_ROWS e.event_id
                            FROM events
                            WHERE events.date > NOW()
                            ORDER BY events.date ASC LIMIT 0, 25
                      ) AS FOUND_EVENTS");

$st2 = $pdo->prepare("SELECT events.*, bands.*
                       FROM events
                           LEFT JOIN bands ON events.event_id = bands.event_id
                       WHERE e.event_id IN (
                           FOUND_EVENTS
                       )
                       ORDER BY events.date ASC");

$st1->execute();
$st2->execute();

Я бы предпочел придерживаться подготовленных операторовесли возможно, но любое рабочее решение было бы замечательно!

1 Ответ

0 голосов
/ 07 ноября 2011

Я бы сделал это в двух отдельных запросах.

Если ваша причина использования SQL_CALC_FOUND_ROWS состоит в том, чтобы попытаться сэкономить время выполнения, вы можете быть удивлены, узнав, что во многих случаях это будет намного, намного быстрее и меньше загружает базу данных, чтобы вместо этого используйте два отдельных запроса, один из которых с простой функцией группировки COUNT (*), чтобы вычислить общее количество строк, а другой с LIMIT для фактического получения строк.

Вот еще объяснение, почему это так .

Более того, если вы делаете это в двух отдельных запросах, то вы можете выполнить тот, который на самом деле извлекает строки first , а затем вам нужно только сделать второй с COUNT (*), если первый вернул максимальное количество строк.

...