Pregunta

Tengo dos consultas, como las siguientes:

SELECT SQL_CALC_FOUND_ROWS Id, Name FROM my_table WHERE Name LIKE '%prashant%' LIMIT 0, 10;
SELECT FOUND_ROWS();

Quiero ejecutar ambas consultas en un solo intento.

$result = mysql_query($query);

Pero luego dime cómo manejaré cada conjunto de tablas por separado. En realidad, en ASP.NET usamos un conjunto de datos que maneja dos consultas como

ds.Tables[0];
ds.Tables[1]; .. etc

¿Cómo puedo hacer lo mismo usando PHP / MYSQL?

¿Fue útil?

Solución

Actualización: aparentemente posible pasando una bandera a mysql_connect () . Consulte Ejecutando múltiples consultas SQL en una declaración con PHP Sin embargo, cualquier lector actual debería evitar usar la clase de funciones mysql_ y preferir PDO.

No puedes hacer eso usando el mysql-api regular en PHP. Solo ejecuta dos consultas. El segundo será tan rápido que no importará. Este es un ejemplo típico de micro optimización. No te preocupes por eso.

Para el registro, se puede hacer usando mysqli y mysqli_multi_query -función.

Otros consejos

Como otros han respondido, la API mysqli puede ejecutar múltiples consultas con la función msyqli_multi_query ().

Por lo que vale, PDO admite múltiples consultas de forma predeterminada, y puede iterar sobre los múltiples conjuntos de resultados de sus múltiples consultas:

$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());

Sin embargo, las consultas múltiples son consideradas ampliamente como una mala idea por razones de seguridad. Si no tiene cuidado con la forma en que construye las cadenas de consulta, puede obtener el tipo exacto de vulnerabilidad de inyección de SQL que se muestra en clásico '' Little Bobby Tables '' Dibujos animados de XKCD . Cuando se utiliza una API que lo restringe a una sola consulta, eso no puede suceder.

Al usar SQL_CALC_FOUND_ROWS no puedes.

  

El recuento de filas disponible a través de FOUND_ROWS () es transitorio y no está destinado a estar disponible más allá de la instrucción que sigue a la instrucción SELECT SQL_CALC_FOUND_ROWS.

Como alguien señaló en su pregunta anterior, el uso de SQL_CALC_FOUND_ROWS es con frecuencia más lento que simplemente obtener un recuento.

Quizás sería mejor hacer esto como una subconsulta:

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;

Tendrá que usar la extensión MySQLi si no desea ejecutar una consulta dos veces:

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);
}

Tienes que usar MySQLi, el código de abajo funciona bien

<?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();
?>

Me gusta esto:

$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);

Dice en el sitio PHP que NO se permiten múltiples consultas (EDIT: esto solo es cierto para la extensión mysql. mysqli y PDO permiten múltiples consultas) . Entonces, no puede hacerlo en PHP, PERO, ¿por qué no puede simplemente ejecutar esa consulta en otra llamada mysql_query (como el ejemplo de Jon)? Todavía debería darte el resultado correcto si usas la misma conexión. Además, mysql_num_rows también puede ayudar.

Sí, es posible sin usar la extensión MySQLi.

Simplemente use CLIENT_MULTI_STATEMENTS en el quinto argumento de mysql_connect .

Consulte los comentarios a continuación publicación de Husni para obtener más información.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top