2009-10-16 2 views
2

Я получаю сообщение об ошибке в php. Каков правильный способ форматирования этой строки для перехода к mysql_query() в php?Переменные MySql и 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 = " 
     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 table type possible_keys key key_len ref rows Extra 
1 PRIMARY agents index NULL user_agent_parsed 28 NULL 82900 Using temporary; Using filesort 
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away

ответ

3

У вас может быть только один запрос за раз в 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"; 

UPDATE

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

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

Тогда в моем BLL (Business 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. 
    } 
3

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

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