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

5
<?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.

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

Фактические запросы намного длиннее, я пытался задать компактный вопрос для улучшения общей картины. Тем не менее, структура существует, и дальнейшие подробности не имеют значения, так как в конце она объединяет все 4 запроса или выполняет их один за другим. Naim
именно поэтому я их и использую. Результаты каскадно снижаются по сравнению с родительскими представлениями. Naim
Почему вы должны продолжать создавать представления? Разве представление не сохраняет в основном ваш запрос и запускает его снова, когда вы выбираете из него? Gohn67
Я совершенно уверен, что есть гораздо более эффективный способ сделать это, но без подробностей об этих таблицах, это немного сложно сказать. GDP

Ваш Ответ

3   ответа
1

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

<?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'];
}

?>
Не забывайте свои точки с запятой.
Я не верю, что разделение этих запросов пробелами является правильным. Поскольку каждый из них предназначен для отдельного запроса, они должны быть разделены точками с запятой. Пример:$query = "CREATE VIEW current_rankings AS SELECT * FROM main_table WHERE date = X;"; (обратите внимание на точку с запятой после X в запросе.
@ElijahMadden - Где я забыл; ?
Привет, Пол. Я добавил эту точку перед =, как показано в вашем ответе, и она вернула ошибку синтаксиса SQL ... Naim
Ваши запросы будут нуждаться в них, если вы объедините в одну строку.
11

Благодаря 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));
}
не работает в php4, mysqli работает только в php5
0

Кажется, вы не выполняете $ 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 будет просто логическим, истина, если @rank_change равен (prev_rank - current_rank), ложь, если это не так. Но нужен ли вообще @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)
@ Elijah - Это было бы идеально, но я не уверен, что это будет возможно, поскольку каждый запрос содержит несколько подзапросов и использует разные пользовательские переменные ... опубликует новый вопрос и опубликует здесь ссылку для вас. Благодарю. Naim
Вы можете просто запускать их один за другим, используя несколько вызовов mysql_query (), или объединять их, как предложил Пол, или переписать их как один запрос (в моем редактировании выше).
Я не знаю о других запросах, которые вы, возможно, выполняете в этой таблице, но в этом случае вы, безусловно, можете сделать это с помощью одного относительно простого запроса.
Правда, но это именно то, что я пытаюсь выяснить: как выполнить все 4 запроса. Naim
Спасибо, Элайджа, но в моем случае невозможно выполнить один-единственный запрос, так как мне нужны очень сложные запросы из main_table, поэтому я должен идти шаг за шагом, используя подзапросы. Попробую предложение Павла и вернусь к нему. Naim

Похожие вопросы