Frage

Ich habe zwei Anfragen, wie folgend:

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

Ich mag diese beiden Abfragen in einem einzigen Versuch auszuführen.

$result = mysql_query($query);

Aber dann sagen Sie mir, wie ich je Tabellen separat eingestellt behandelt. Eigentlich in ASP.NET verwenden wir Dataset, die als zwei Abfragen behandelt

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

Wie kann ich das gleiche tun mit PHP / MYSQL?

War es hilfreich?

Lösung

Update: Anscheinend möglich durch eine Flagge mysql_connect() vorbei. Siehe Ausführen mehrere SQL-Abfragen in einer Anweisung mit PHP Trotzdem alle aktuellen Leser sollten die mysql_-Klasse von Funktionen vermeiden, mit und PDO bevorzugen.

Sie können nicht tun, dass der regelmäßigen mysql-api in PHP. Führen Sie einfach zwei Abfragen. Der zweite wird so schnell sein, dass es keine Rolle, wird. Dies ist ein typisches Beispiel für Mikro-Optimierung. Mach dir keine Sorgen darüber.

Für das Protokoll, es kann getan werden mit mysqli und dem mysqli_multi_query -function.

Andere Tipps

Wie andere beantwortet haben, die mysqli API Multi-Abfragen mit der msyqli_multi_query () Funktion ausführen kann.

Für das, was es wert ist, PDO unterstützt Multi-Abfrage standardmäßig und Sie können die mehrere Ergebnismengen Ihrer mehrere Abfragen iterieren:

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

Allerdings ist Multi-Abfrage ziemlich weit eine schlechte Idee aus Sicherheitsgründen in Betracht gezogen. Wenn Sie nicht vorsichtig sind, wie Sie Ihre Abfrage-Strings konstruieren, können Sie tatsächlich die genaue Art der SQL-Injection-Schwachstelle in dem gezeigt bekommen Klassiker "Little Bobby Tables" XKCD Cartoon . Wenn eine API, die Sie Einzel Abfrage beschränken, kann das nicht passieren.

Mit SQL_CALC_FOUND_ROWS Sie können nicht.

  

Die Zeilenanzahl verfügbar durch FOUND_ROWS () ist vorübergehend und nicht über die Anweisung zur Verfügung stehen sollte im Anschluss an der SELECT SQL_CALC_FOUND_ROWS Anweisung.

Als jemand bemerkte, in Ihrer früheren Frage, mit SQL_CALC_FOUND_ROWS ist häufig langsamer als nur eine Zählung zu bekommen.

Vielleicht möchten Sie am besten dran, dies zu tun, wie als Unterabfrage:

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;

Sie werden die MySQLi Erweiterung verwenden, wenn Sie nicht zweimal eine Abfrage ausführen wollen:

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

Sie haben MySQLi zu verwenden, unter Code funktioniert gut

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

Wie folgt aus:

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

Er sagt, auf der PHP-Website, die mehrere Abfragen sind nicht zulässig (EDIT:. Dies ist für die mySQL-Erweiterung nur wahr mysqli und PDO erlaubt mehreren Abfragen) . So kann man es nicht in PHP, aber, warum können Sie nicht ausführen nur die Abfrage in einem anderen mysql_query Aufruf, (wie Jons Beispiel)? Es sollte Ihnen noch das richtige Ergebnis geben, wenn Sie die gleiche Verbindung verwenden. Auch mysql_num_rows kann auch helfen.

Ja, es ist möglich ohne MySQLi Erweiterung.

Simply CLIENT_MULTI_STATEMENTS in mysql_connect des fünften Argument verwenden.

Siehe

auf die Ausführungen unter Husni der Post für weitere Informationen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top