Переменные MySql и php

Я получаю сообщение об ошибке в php. Каков правильный способ форматирования этой строки для перехода к mysql_query () в php?

SELECT count(*) FROM agents INTO @AgentCount; SELECT user_agent_parsed, user_agent_original, COUNT( user_agent_parsed ) AS thecount, COUNT( * ) / ( @AgentCount) AS percentage FROM agents GROUP BY user_agent_parsed ORDER BY thecount DESC LIMIT 50; 

В php, вот как я настроил $ query

  $query = " SELECT count(*) FROM agents INTO @AgentCount; SELECT user_agent_parsed, user_agent_original, COUNT( user_agent_parsed ) AS thecount, COUNT( * ) / ( @AgentCount) AS percentage FROM agents GROUP BY user_agent_parsed ORDER BY thecount DESC LIMIT 50"; 

Этот точный запрос будет работать нормально, если я поместил его непосредственно в MySql через сеанс командной строки. Нужно ли мне выдавать два отдельных php-вызова в mysql_query () и сохранять первый результат?

Я получаю следующую ошибку:

У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «SELECT user_agent_parsed, user_agent_original, COUNT (user_agent_parsed) AS thecount» в строке 3

Причина того, что вы не используете дополнительный выбор и вместо этого выбираете переменную MySql, заключается в том, чтобы избежать вычисления count () при каждом процентном вычислении. Хотя это может быть возможно, двигатель оптимизирует для этого. До сих пор я не смог это подтвердить. Я также слышал, что подвыборы почти всегда не оптимальны.

EXPLAIN говорит мне следующее:

 id select_type тип таблицы possible_keys key key_len ref rows Extra
 1 индекс первичных агентов NULL user_agent_parsed 28 NULL 82900 Использование временных;  Использование filesort
 2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Выберите таблицы, оптимизированные 

Вы можете иметь только один запрос за раз в PHP.

  $query1 = "SELECT count(*) FROM agents INTO @AgentCount" $query2=" SELECT user_agent_parsed, user_agent_original, COUNT( user_agent_parsed ) AS thecount, COUNT( * ) / ( @AgentCount) AS percentage FROM agents GROUP BY user_agent_parsed ORDER BY thecount DESC LIMIT 50"; 

ОБНОВИТЬ

У меня есть DAL, который содержит все мои qieries. Типичная функция в моем DAL выглядит так:

 // These functions are reusable public function getAllRows($table) { $sql =" SELECT * FROM $table"; $this->query($sql); return $this->query_result; } 

Затем в моем BLL (Busines Layer) у меня есть следующее:

  public function getUserAgents() { $result = parent::getAllRows(); $row = mysql_fetch_array($result); return $row[0]; // Retrieves the first row // Then you take this value and to a second request. Then return the answer / rows. } 

Если вы используете mysql_query , то да, вам нужно отправить каждый запрос отдельно. Из описания в верхней части записи mysql_query в руководстве по PHP : «mysql_query () отправляет уникальный запрос (несколько запросов не поддерживаются) в текущую активную базу данных …»

Что касается подзапросов, вы будете удивлены; оптимизатор запросов обычно отлично их обрабатывает.