如何在php/mysql中将两个mysql查询作为一个查询执行?

0x6upsns  于 2021-06-24  发布在  Mysql
关注(0)|答案(8)|浏览(376)

我有两个问题,如下:

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

我想在一次尝试中执行这两个查询。

$result = mysql_query($query);

但请告诉我如何分别处理每一张table。实际上,在asp.net中,我们使用数据集作为

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

如何使用php/mysql实现同样的功能?

jpfvwuh4

jpfvwuh41#

使用 SQL_CALC_FOUND_ROWS 你不能。
通过found\u rows()可用的行计数是暂时的,不适用于select sql\u calc\u found\u 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;
uplii1fm

uplii1fm2#

它在php站点上说不允许多个查询(edit:这只适用于mysql扩展。mysqli和pdo允许多个查询)。所以你不能用php来实现,但是,为什么不能在另一个mysql\u查询调用中执行这个查询呢(比如jon的例子)?如果您使用相同的连接,它仍应提供正确的结果。另外,mysql\u num\u行也可能有帮助。

qyzbxkaa

qyzbxkaa3#

你必须使用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();
?>
tcbh2hod

tcbh2hod4#

这样地:

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

piah890a5#

是的,不使用mysqli扩展也是可能的。
简单使用 CLIENT_MULTI_STATEMENTSmysql_connect 的第五个论点。
有关更多信息,请参阅husni帖子下面的评论。

pdkcd3nj

pdkcd3nj6#

正如其他人所回答的,mysqli api可以使用msyqli\u multi\u 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());

然而,出于安全考虑,多查询被广泛认为是一个坏主意。如果您对如何构造查询字符串不小心,实际上可以得到典型的“小bobby表”xkcd动画中所示的sql注入漏洞的确切类型。当使用一个api将您限制为单个查询时,这是不可能的。

6tqwzwtp

6tqwzwtp7#

更新:显然可以通过传递一个标志给 mysql_connect() . 请参阅使用php在一条语句中执行多个sql查询。尽管如此,任何当前读取器都应避免使用 mysql_ -函数类和pdo。
在php中使用常规mysql api无法做到这一点。只需执行两个查询。第二个会很快,没关系。这是一个典型的微观优化例子。别担心。
对于记录,可以使用mysqli和mysqli\u multi\u query-function来完成。

icomxhvb

icomxhvb8#

如果不想执行两次查询,则必须使用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);
}

相关问题