(Да, я «тщательно искал ответ, прежде чем задавать свой вопрос» … но не нашел «правильный» ответ на мою проблему. Я прочитал MySQL о пользовательских переменных … Я прочитал PHP человек относительно PDO … все еще не может понять решение.)
Я пытаюсь получить из PHP-кода тот же набор результатов, который был возвращен из этого оператора SQL, который корректно и успешно выполняется в PhpMyAdmin:
SET @x := 0; SELECT * FROM ( SELECT `o`.`timestamp` `o`.`v_phase_a` , `o`.`v_phase_b` , `o`.`v_phase_c` , (@x := @x+1) AS x FROM `operational_parameters` AS o WHERE `o`.`timestamp` >= '2014-01-21 05:00:00' AND `o`.`timestamp` <= '2014-02-04 04:59:30' ORDER BY `o`.`timestamp` ) t WHERE x MOD 336 = 0;
Обоснование типа набора результатов – долгая история и уходит своими корнями в бизнес-требования моего клиента. Он должен представлять собой единую выборку данных, хранящихся в виде строк, вставленных на расстоянии 30 секунд в течение заданного промежутка времени, в этом случае 2 недели … этот конкретный оператор возвращает ровно 120 строк данных, которые затем упаковываются с помощью PHP и отправляются на Пользовательский интерфейс, который будет отображаться с помощью подключаемого модуля jqplot …
Все остальное отлично работает, за исключением того, что в PHP я не могу выполнить несколько операторов SQL, процесс, который, как мне кажется, потребуется для установки моей переменной пользователя @x для использования в следующей инструкции SELECT. Опять же, этот SQL работает очень хорошо, когда вы запрашиваете мою базу данных с помощью phpMyAdmin …
Я действительно понимаю, что, вообще говоря, внутри PHP невозможно выполнить несколько операторов SQL в одном запросе …
Можно ли, однако, создать инструкцию SINGLE SQL – как строку – вы получите тот же набор результатов, что и MySQL, используя инструмент phpMyAdmin и SQL, указанный выше? Единственное утверждение, которое я могу передать моему вновь созданному PDO внутри моего PHP и получить нужное количество строк?
(Похоже, что PDOs должны иметь возможность обрабатывать такой сценарий, по крайней мере, это то, что я почерпнул из моего исследования этой доски …)
Я как бы новичок в PHP / MySQL, поэтому я готов учиться. Научитесь!
Вы можете переместить инициализацию в подзапрос:
SELECT * FROM (SELECT o.timestamp , o.v_phase_a , o.v_phase_b , o.v_phase_c , (@x := @x+1) AS x FROM operational_parameters AS o cross join (select @x := 0) const WHERE o.timestamp >= '2014-01-21 05:00:00' AND o.timestamp <= '2014-02-04 04:59:30' ORDER BY o.timestamp ) t WHERE x MOD 336 = 0;