Как выполнить два запроса mysql как один в PHP/MYSQL?
У меня есть два запроса:
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?
Ответы
Ответ 1
Обновление: Очевидно, возможно, передав флаг mysql_connect()
. См. Выполнение нескольких SQL-запросов в одном выражении с помощью PHP Тем не менее, любой текущий читатель должен избегать использования класса mysql_
и предпочитает PDO.
Вы не можете сделать это, используя обычный mysql-api в PHP. Просто выполните два запроса. Второй будет настолько быстрым, что это не имеет значения. Это типичный пример микрооптимизации. Не беспокойтесь об этом.
Для записи это можно сделать с помощью mysqli и mysqli_multi_query -функция.
Ответ 2
Как ответили другие, 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-инъекции, показанной в классическом "Little Bobby Tables" XKCD мультфильм. При использовании API, который ограничивает вас одним запросом, этого не может быть.
Ответ 3
Используя 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;
Ответ 4
Вам нужно будет использовать расширение 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);
}
Ответ 5
Вот так:
$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);
Ответ 6
Вы должны использовать 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();
?>
Ответ 7
Он говорит на PHP-сайте, что несколько запросов не разрешены (EDIT: Это верно только для расширения mysql. mysqli и PDO разрешить несколько запросов)
, Таким образом, вы не можете сделать это в PHP, НО, почему вы не можете просто выполнить этот запрос в другом вызове mysql_query (например, пример Jon)? Он должен по-прежнему давать правильный результат, если вы используете одно и то же соединение. Кроме того, mysql_num_rows также может помочь.
Ответ 8
Да, возможно без использования расширения MySQLi.
Просто используйте CLIENT_MULTI_STATEMENTS
в mysql_connect
5-й аргумент.
Для получения дополнительной информации см. комментарии ниже Husni post.