У меня есть два запроса:
SELECT SQL_CALC_FOUND_ROWS Id, Name FROM my_table WHERE Name LIKE '%prashant%' LIMIT 0, 10; SELECT FOUND_ROWS();
Я хочу выполнить оба этих запроса в одной попытке.
$result = mysql_query($query);
Но тогда скажите мне, как я буду обрабатывать каждую таблицу отдельно. Фактически в ASP.NET мы используем набор данных, который обрабатывает два запроса как
ds.Tables[0]; ds.Tables[1]; .. etc
Как я могу сделать то же самое с помощью PHP / MYSQL?
Обновление: возможно, возможно, передав флаг mysql_connect()
. См. Выполнение нескольких SQL-запросов в одном выражении с помощью PHP. Тем не менее, любой текущий читатель должен избегать использования класса mysql_
функций и предпочитает PDO.
Вы не можете этого сделать, используя обычный mysql-api в PHP. Просто выполните два запроса. Второй будет настолько быстрым, что это не имеет значения. Это типичный пример микрооптимизации. Не беспокойтесь об этом.
Для записи это можно сделать с помощью mysqli и mysqli_multi_query -функции.
Как и другие, API-интерфейс mysqli может выполнять многозадачные запросы с помощью функции msyqli_multi_query ().
Для того, что стоит, PDO поддерживает по умолчанию многозадачный запрос, и вы можете перебирать несколько наборов результатов из ваших многочисленных запросов:
$stmt = $dbh->prepare(" select sql_calc_found_rows * from foo limit 1 ; select found_rows()"); $stmt->execute(); do { while ($row = $stmt->fetch()) { print_r($row); } } while ($stmt->nextRowset());
Тем не менее, многопроцессор довольно широко считается плохой идеей по соображениям безопасности. Если вы не будете осторожны в том, как вы строите строки запроса, вы можете получить точный тип уязвимости SQL-инъекций, показанный в классическом мультфильме X Little Little Bobby Tables . При использовании API, который ограничивает вас одним запросом, этого не может быть.
С помощью SQL_CALC_FOUND_ROWS
вы не можете.
Количество строк, доступное через FOUND_ROWS (), является переходным и не предназначено для доступности после оператора, следующего за оператором SELECT SQL_CALC_FOUND_ROWS.
Как заметил в предыдущем вопросе, использование SQL_CALC_FOUND_ROWS
часто медленнее, чем просто подсчет.
Возможно, вам было бы лучше сделать это как подзапрос:
SELECT (select count(*) from my_table WHERE Name LIKE '%prashant%') as total_rows, Id, Name FROM my_table WHERE Name LIKE '%prashant%' LIMIT 0, 10;
Вам нужно будет использовать расширение MySQLi, если вы не хотите выполнять запрос дважды:
if (mysqli_multi_query($link, $query)) { $result1 = mysqli_store_result($link); $result2 = null; if (mysqli_more_results($link)) { mysqli_next_result($link); $result2 = mysqli_store_result($link); } // do something with both result sets. if ($result1) mysqli_free_result($result1); if ($result2) mysqli_free_result($result2); }
Как это:
$result1 = mysql_query($query1); $result2 = mysql_query($query2); // do something with the 2 result sets... if ($result1) mysql_free_result($result1); if ($result2) mysql_free_result($result2);
Вы должны использовать MySQLi, ниже код работает хорошо
<?php $mysqli = new mysqli("localhost", "my_user", "my_password", "world"); /* check connection */ if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } $query = "SELECT CURRENT_USER();"; $query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5"; /* execute multi query */ if ($mysqli->multi_query($query)) { do { /* store first result set */ if ($result = $mysqli->store_result()) { while ($row = $result->fetch_row()) { printf("%s\n", $row[0]); } $result->free(); } /* print divider */ if ($mysqli->more_results()) { printf("-----------------\n"); } } while ($mysqli->next_result()); } /* close connection */ $mysqli->close(); ?>
На PHP-сайте указано, что несколько запросов НЕ разрешены (EDIT: это верно только для расширения mysql. Mysqli и PDO позволяют несколько запросов). Поэтому вы не можете сделать это в PHP, НО, почему вы не можете просто выполнить этот запрос в другом вызове mysql_query (например, пример Джона)? Он должен по-прежнему давать правильный результат, если вы используете одно и то же соединение. Кроме того, mysql_num_rows также может помочь.
Да, это возможно без использования расширения MySQLi.
Просто используйте CLIENT_MULTI_STATEMENTS
в 5-м аргументе mysql_connect
.
Более подробную информацию см. В комментариях к сообщению Хусни .