Я получаю сообщение об ошибке в 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 () отправляет уникальный запрос (несколько запросов не поддерживаются) в текущую активную базу данных …»
Что касается подзапросов, вы будете удивлены; оптимизатор запросов обычно отлично их обрабатывает.