php / mysql с несколькими запросами

<?php $query1 = "CREATE VIEW current_rankings AS SELECT * FROM main_table WHERE date = X"; $query2 = "CREATE VIEW previous_rankings AS SELECT rank FROM main_table WHERE date = date_sub('X', INTERVAL 1 MONTH)"; $query3 = "CREATE VIEW final_output AS SELECT current_rankings.player, current_rankings.rank as current_rank LEFT JOIN previous_rankings.rank as prev_rank ON (current_rankings.player = previous_rankings.player)"; $query4 = "SELECT *, @rank_change = prev_rank - current_rank as rank_change from final_output"; $result = mysql_query($query4) or die(mysql_error()); while($row = mysql_fetch_array($result)) { echo $row['player']. $row['current_rank']. $row['prev_rank']. $row['rank_change']; } ?> 

Все запросы работают независимо, но я действительно пытаюсь собрать все фрагменты в одном результате, поэтому я могу использовать его с mysql_fetch_array.

Я попытался создать представления, а также временные таблицы, но каждый раз, когда он либо говорит, что таблица не существует, либо возвращает пустой цикл набора fetch … логика есть, но синтаксис перепутался, я думаю, поскольку это первый раз, когда мне приходилось иметь дело с несколькими запросами, мне нужно объединить все вместе. С нетерпением ждем некоторой поддержки. Большое спасибо.

Благодаря php.net я придумал решение: вы должны использовать (mysqli_multi_query($link, $query)) для запуска нескольких связанных запросов.

  /* create sql connection*/ $link = mysqli_connect("server", "user", "password", "database"); $query = "SQL STATEMENTS;"; /* first query : Notice the 2 semicolons at the end ! */ $query .= "SQL STATEMENTS;"; /* Notice the dot before = and the 2 semicolons at the end ! */ $query .= "SQL STATEMENTS;"; /* Notice the dot before = and the 2 semicolons at the end ! */ $query .= "SQL STATEMENTS"; /* last query : Notice the dot before = at the end ! */ /* Execute queries */ if (mysqli_multi_query($link, $query)) { do { /* store first result set */ if ($result = mysqli_store_result($link)) { while ($row = mysqli_fetch_array($result)) /* print your results */ { echo $row['column1']; echo $row['column2']; } mysqli_free_result($result); } } while (mysqli_next_result($link)); } 

Вы должны объединить их:

 <?php $query = "CREATE VIEW current_rankings AS SELECT * FROM main_table WHERE date = X"; $query .= " CREATE VIEW previous_rankings AS SELECT rank FROM main_table WHERE date = date_sub('X', INTERVAL 1 MONTH)"; $query .= " CREATE VIEW final_output AS SELECT current_rankings.player, current_rankings.rank as current_rank LEFT JOIN previous_rankings.rank as prev_rank ON (current_rankings.player = previous_rankings.player)"; $query .= " SELECT *, @rank_change = prev_rank - current_rank as rank_change from final_output"; $result = mysql_query($query) or die(mysql_error()); while($row = mysql_fetch_array($result)) { echo $row['player']. $row['current_rank']. $row['prev_rank']. $row['rank_change']; } ?> 

Кажется, вы не выполняете $ query1 – $ query3. Вы только что перешли к $ query4, который не будет работать, если другие не были выполнены в первую очередь.

Также

 $query4 = "SELECT *, @rank_change = prev_rank - current_rank as rank_change from final_output"; 

вероятно, должно быть

 $query4 = "SELECT *, @rank_change := prev_rank - current_rank as rank_change from final_output"; 

или значение rank_change будет просто логическим, true, если @rank_change равно (prev_rank – current_rank), false, если это не так. Но вам вообще нужно @rank_change? Будете ли вы использовать его в следующем запросе? Может быть, вы можете полностью удалить его.

Еще лучше, вы могли бы просто объединить все запросы в одно:

 SELECT curr.player, curr.rank AS current_rank, @rank_change := prev.rank - curr.rank AS rank_change FROM main_table AS curr LEFT JOIN main_table AS prev ON curr.player = prev.player WHERE curr.date = X AND prev.date = date_sub('X', INTERVAL 1 MONTH)