Cum pot număra numărul de rânduri pe care le-a returnat o interogare MySQL? (Programare, Php, Mysql)

phpaddict a intrebat.

Cum pot număra numărul de rânduri pe care le-a returnat o interogare MySQL?

Comentarii

  • În ce limbaj încercați să faceți acest lucru? Asta ne-ar ajuta să vă oferim o implementare bună. –  > Por Papagalii.
11 răspunsuri
Paul Dixon

Obținerea numărului total de rânduri în rezultatul unei interogări…

Ai putea să iterezi rezultatul și să le numeri. Nu spuneți ce limbaj sau ce bibliotecă de client folosiți, dar API-ul oferă o funcție mysql_num_rows care vă poate spune numărul de rânduri dintr-un rezultat.

Aceasta este expusă în PHP, de exemplu, sub forma funcției mysqli_num_rows . Întrucât ați modificat întrebarea pentru a menționa că utilizați PHP, iată un exemplu simplu care utilizează funcțiile mysqli:

$link = mysqli_connect("localhost", "user", "password", "database");

$result = mysqli_query($link, "SELECT * FROM table1");
$num_rows = mysqli_num_rows($result);

echo "$num_rows Rows
";

Obținerea unui număr de rânduri care corespund unor criterii…

Folosiți COUNT(*) – vedeți Numărarea rândurilor în manualul MySQL. De exemplu:

SELECT COUNT(*) FROM foo WHERE bar= 'value';

Obțineți numărul total de rânduri atunci când se utilizează LIMIT…

Dacă ați utilizat o clauză LIMIT, dar doriți să știți câte rânduri ați obține fără ea, utilizați SQL_CALC_FOUND_ROWS în interogarea dvs., urmată de SELECT FOUND_ROWS();

SELECT SQL_CALC_FOUND_ROWS * FROM foo
   WHERE bar="value" 
   LIMIT 10;

SELECT FOUND_ROWS();

Pentru tabelele foarte mari, acest lucru nu va fi deosebit de eficient și este mai bine să executați o interogare mai simplă pentru a obține o numărătoare și să o puneți în cache înainte de a executa interogările pentru a obține pagini de date.

Comentarii

  • +1 pentru includerea SQL_CALC_FOUND_ROWS și a contextului adecvat în care să fie utilizat –  > Por robmerica.
  • -1 SQL CALC FOUND ROWS este o operațiune FOARTE solicitantă. Aceasta ar trebui evitată. și poate fi evitată prin crearea aceleiași interogări ca și înainte, selectând doar ID-ul și nu . De asemenea, select * ar trebui să fie evitat și … vezi aici: parseerror.com/sql/selectisevil.html –  > Por Petrogad.
  • te rog, folosește COUNT(some_field) în loc de COUNT(*) –  > Por cawecoy.
  • Vă rugăm să fiți atenți la utilizarea mysql_num_rows. Este deprins începând cu PHP 5.5 și va fi eliminat în viitor: php.net/manual/en/function.mysql-num-rows.php –  > Por Gareth Lewis.
Marcel Zebrowski

În cazul în care trebuie să rezolvați problema cu SQL simplu, ați putea folosi o vizualizare în linie.

select count(*) from (select * from foo) as x;

Comentarii

  • Aceasta nu este o „subquery”, ci mai degrabă o vedere în linie –  > Por T.S..
  • Tot m-a ajutat pentru problema mea specifică. Mulțumesc –  > Por Avatar.
Stepan Mazurov

Dacă interogarea dvs. SQL are un LIMIT clauză și doriți să știți câte rezultate totale sunt în acel set de date, puteți utiliza SQL_CALC_FOUND_ROWS urmat de SELECT FOUND_ROWS(); Acest lucru returnează numărul de rânduri MULT mai eficient decât folosind COUNT(*)
Exemplu (direct din documentația MySQL):

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
    -> WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();

Robert

Dacă doriți rezultatul plus numărul de rânduri returnate, faceți ceva de genul următor. Folosind PHP.

$query = "SELECT * FROM Employee";
$result = mysql_query($query);
echo "There are ".mysql_num_rows($result)." Employee(s).";

Quassnoi
SELECT SQL_CALC_FOUND_ROWS *
FROM   table1
WHERE  ...;

SELECT FOUND_ROWS();

FOUND_ROWS() trebuie să fie apelat imediat după interogare.

Trevor Bramble

Presupunând că folosiți funcțiile mysql_ sau mysqli_, întrebarea dvs. ar trebui să fi primit deja un răspuns de la alții.

Cu toate acestea, dacă folosiți PDO, nu există o funcție ușoară pentru a returna numărul de rânduri recuperate de o instrucțiune select, din păcate. Trebuie să folosiți count() pe setul de rezultate (după ce îl atribuiți unei variabile locale, de obicei).

Sau, dacă vă interesează doar numărul și nu datele, PDOStatement::fetchColumn() pe rezultatul SELECT COUNT(1)…..

Comentarii

  • Nu știi dacă OP folosește PHP. 🙂 –  > Por Paolo Bergantino.
  • Q citește: „Cum pot număra numărul de rânduri pe care le-a returnat o interogare mysql? folosind PHP..” când am găsit-o. =^) –  > Por Trevor Bramble.
Drew

Având în vedere că suntem în 2015, iar deprecierea lui mysql_* funcționalității, aceasta este o PDO-vizualizare exclusivă.

<?php
    // Begin Vault (this is in a vault, not actually hard-coded)
    $host="hostname";
    $username="GuySmiley";
    $password="thePassword";
    $dbname="dbname";
    // End Vault

    $b='</br>';
    try {
        $theCategory="fruit";   // value from user, hard-coded here to get one in

        $dbh = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password);
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        // prepared statement with named placeholders
        $stmt = $dbh->prepare("select id,foodName from foods where category=:theCat and perishable=1");
        $stmt->bindParam(':theCat', $theCategory, PDO::PARAM_STR,20);
        $stmt->execute();
        echo "rowCount() returns: ".$stmt->rowCount().$b;   // See comments below from the Manual, varies from driver to driver

        $stmt = $dbh->prepare("select count(*) as theCount from foods where category=:theCat and perishable=1");
        $stmt->bindParam(':theCat', $theCategory, PDO::PARAM_STR,20);
        $stmt->execute();
        $row=$stmt->fetch();    // fetches just one row, which is all we expect
        echo "count(*) returns: ".$row['theCount'].$b;

        $stmt = null;
        // PDO closes connection at end of script
    } catch (PDOException $e) {
        echo 'PDO Exception: ' . $e->getMessage();
        exit();
    }
?>

Schema pentru testare

create table foods
(   id int auto_increment primary key,
    foodName varchar(100) not null,
    category varchar(20) not null,
    perishable int not null
);
insert foods (foodName,category,perishable) values 
('kiwi','fruit',1),('ground hamburger','meat',1),
('canned pears','fruit',0),('concord grapes','fruit',1);

În cazul implementării mele, obțin ieșirea din 2 atât pentru echos de mai sus. scop celor 2 strategii de mai sus este de a determina dacă implementarea driverului dumneavoastră emite rowCount, iar dacă nu, de a căuta o strategie de rezervă.

Din manualul privind PDOStatement::rowCount:

PDOStatement::rowCount() returnează numărul de rânduri afectate de o instrucțiune DELETE, INSERT sau UPDATE.

For most databases, , PDOStatement::rowCount() nu returnează numărul de rânduri afectate de o instrucțiune SELECT. În schimb, utilizați PDO::query() pentru a emite o instrucțiune SELECT COUNT(*) cu aceleași predicte ca și instrucțiunea SELECT pe care o intenționați, apoi utilizați PDOStatement::fetchColumn() pentru a prelua numărul de rânduri care vor fi returnate. Aplicația dvs. poate efectua apoi acțiunea corectă.

Dave Hilditch

Dacă preluați date folosind WordPress, puteți accesa numărul de rânduri returnate folosind $wpdb->num_rows:

$wpdb->get_results( $wpdb->prepare('select * from mytable where foo = %s', $searchstring));
echo $wpdb->num_rows;

Dacă doriți un număr specific bazat pe o interogare de numărare mysql, atunci faceți acest lucru:

$numrows = $wpdb->get_var($wpdb->prepare('SELECT COUNT(*) FROM mytable where foo = %s', $searchstring );
echo $numrows;

Dacă executați actualizări sau ștergeri, atunci numărul de rânduri afectate este returnat direct din apelul funcției:

$numrowsaffected = $wpdb->query($wpdb->prepare(
   'update mytable set val=%s where myid = %d', $valuetoupdate, $myid));

Acest lucru este valabil și pentru $wpdb->update și $wpdb->delete.

Dharman

Noțiuni de bază

Pentru a obține numărul de rânduri care corespund în SQL, în mod normal se utilizează COUNT(*). De exemplu:

SELECT COUNT(*) FROM some_table

Pentru a obține această valoare în PHP, trebuie să extrageți valoarea din prima coloană din primul rând al rezultatului returnat. Un exemplu care utilizează PDO și mysqli este demonstrat mai jos.

Cu toate acestea, dacă doriți să obțineți rezultatele și apoi să știți câte înregistrări ați obținut folosind PHP, puteți folosi count() sau să profitați de numărul precompletat în obiectul rezultat, dacă API-ul bazei de date o oferă, de exemplu. mysqli’s num_rows.

Utilizarea MySQLi

Utilizând mysqli, puteți prelua primul rând folosind fetch_row() și apoi să accesați 0 care ar trebui să conțină valoarea lui COUNT(*).

// your connection code
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'dbuser', 'yourdbpassword', 'db_name');
$mysqli->set_charset('utf8mb4');

// your SQL statement
$stmt = $mysqli->prepare('SELECT COUNT(*) FROM some_table WHERE col1=?');
$stmt->bind_param('s', $someVariable);
$stmt->execute();
$result = $stmt->get_result();

// now fetch 1st column of the 1st row 
$count = $result->fetch_row()[0];

echo $count;

Dacă doriți să obțineți toate rândurile, dar să cunoașteți totuși numărul de rânduri, atunci puteți utiliza num_rows sau count().

// your SQL statement
$stmt = $mysqli->prepare('SELECT col1, col2 FROM some_table WHERE col1=?');
$stmt->bind_param('s', $someVariable);
$stmt->execute();
$result = $stmt->get_result();

// If you want to use the results, but still know how many records were fetched
$rows = $result->fetch_all(MYSQLI_ASSOC);

echo $result->num_rows;
// or
echo count($rows);

Utilizarea PDO

Utilizarea PDO este mult mai simplă. Puteți apela direct la fetchColumn() pe declarație pentru a obține valoarea unei singure coloane.

// your connection code
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', 'root', '', [
    PDO::ATTR_EMULATE_PREPARES => false,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);

// your SQL statement
$stmt = $pdo->prepare('SELECT COUNT(*) FROM some_table WHERE col1=?');
$stmt->execute([
    $someVariable
]);

// Fetch the first column of the first row
$count = $stmt->fetchColumn();

echo $count;

Din nou, dacă aveți nevoie oricum să extrageți toate rândurile, atunci puteți să le obțineți folosind count() funcția .

// your SQL statement
$stmt = $pdo->prepare('SELECT col1, col2 FROM some_table WHERE col1=?');
$stmt->execute([
    $someVariable
]);

// If you want to use the results, but still know how many records were fetched
$rows = $stmt->fetchAll();

echo count($rows);

Declarația PDO nu oferă o proprietate precalculată cu numărul de rânduri recuperate, dar are o metodă numită rowCount(). Această metodă vă poate spune numărul de rânduri returnate în rezultat, dar nu se poate baza pe ea și, în general, nu este recomandat să o utilizați.

druid62

Acesta nu este un răspuns direct la întrebare, dar în practică vreau adesea să am o estimare a numărului de rânduri care va fi în setul de rezultate. Pentru majoritatea tipurilor de interogări, „EXPLAIN” de la MySQL oferă acest lucru.

Eu, de exemplu, îl folosesc pentru a refuza să execut o interogare a unui client dacă explicația pare destul de proastă.

Apoi, executați zilnic „ANALYZE LOCAL TABLE” (în afara replicării, pentru a preveni blocajele clusterului) pe tabelele dumneavoastră, pe fiecare server MySQL implicat.

Bhargav Variya
> SELECT COUNT(*) AS total FROM foo WHERE bar= 'value';

Tags:,