Sorok száma MySQL táblában listázással
2022-02-01T14:58:57+01:00
2022-02-02T11:19:25+01:00
2022-08-12T07:05:30+02:00
*deleted_23419333
Sziasztok!

Van egy egyszerű lekérdezés, mondjuk:

$sql1 = "SELECT * FROM `hajszalak`";

A mysqli_num_rows PHP függvénnyel megkapom az összes sor számát (példa kedvéért: 50). Szuper.

$sql2 = "SELECT * FROM `hajszalak` LIMIT 25";

Ezzel megkapom az első 25 sort. Ez is szuper.

Egy MySQL lekérdezéssel nem tudnék ilyen kimenetet produkálni, hogy ne kelljen a két lekérdezés?

<?php print '{ "osszes_hajszal": 50, "hajszalak": { "1": "szőke", "2": "barna", "3": "fekete", "4": "vörös", // ... "25": "zöld" } }'; ?>

Tehát kellene egy lista az első 25 sorról, illetve kellene a sorok száma.

Gyorsaság miatt szeretném megúszni 1 lekérdezéssel (2 helyett), de ha a 2 lekérdezés gyorsabb mint az 1 összetettebb, akkor kérlek azt is írjátok meg. Előre is köszönöm.
Mutasd a teljes hozzászólást!
select *, (select count(*) from hajszalak) from hajszalak;
Ez mukodik sqlite-ban, nincs most keznel mysql, hogy ellenorizzem ott is. Ez nem a leghatekonyabb megoldas mert elvileg a belso query-t ujraszamolhatja minden sorra de szerintem a legtobb db motor lesz annyira okos, hogy lassa, hogy nem fugg a sortol az adat es csak egyszer szamolja ki.
Mutasd a teljes hozzászólást!

  • Régen volt ilyen:

    SELECT SQL_CALC_FOUND_ROWS field_name FROM col WHERE CLAUSE LIMIT X; SELECT FOUND_ROWS()
    de ezt kivezették. Szóval két lekérdezés kell...
    Mutasd a teljes hozzászólást!
  • select *, (select count(*) from hajszalak) from hajszalak;
    Ez mukodik sqlite-ban, nincs most keznel mysql, hogy ellenorizzem ott is. Ez nem a leghatekonyabb megoldas mert elvileg a belso query-t ujraszamolhatja minden sorra de szerintem a legtobb db motor lesz annyira okos, hogy lassa, hogy nem fugg a sortol az adat es csak egyszer szamolja ki.
    Mutasd a teljes hozzászólást!
  • Működik:

    SELECT `id`, ( SELECT COUNT( `id` ) FROM `hajszalak` ) AS `all` FROM `hajszalak` LIMIT 25;

    De gyorsaság szempontjából ez a kettő nem ugyanaz?

    mysqli_query( "SELECT COUNT( `id` ) AS `all` FROM `hajszalak`" ); mysqli_query( "SELECT `id` FROM `hajszalak` LIMIT 25" );
    Mutasd a teljes hozzászólást!
  • De gyorsaság szempontjából ez a kettő nem ugyanaz?

    Nem, de az, hogy melyik a gyorsabb az fugg eleg sok mindentol ugyhogy nehez ra altalanos valaszt adni. Fugg pl: milyen messze van a db szerver(ugyanaz a gep, ugyanaz az adatcenter esetleg a fold masik fele) mert a masodik verzio 2x fog elmenni a db-hez lekerdezni. Fugg a lekerdezes optimalizaciojatol, indexektol, tabla merettol es meg valoszinuleg egy rakas dologtol ami most nem jutott eszembe.
    Mutasd a teljes hozzászólást!
  • Hali!

    De gyorsaság szempontjából ez a kettő nem ugyanaz?

    Nem, egyáltalán nem ugyanaz. Viszont a MySQL fejlesztői – legalábbis a doksi szerint – a külön COUNT(*)-os LIMIT nélküli plusz lekérdezést ajánlják.

    Mutasd a teljes hozzászólást!
  • SELECT (@sor := @sor + 1) AS `sor`, `h`.* FROM `hajszalak` AS `h`, (SELECT @sor := 0) `r` LIMIT 25
    Mutasd a teljes hozzászólást!
  • Hali!

    Ennek a kérdés szempontjából nem sok értelme van. M. Aladár azt szeretné, hogy lekérdezi az – adott rendezettség és szűrő-feltételek szerinti – első N darab sort, viszont tudni szeretné, hogy összesen mennyi sor van. A te SQL-mondatod ezt az infót nem adja vissza, csak egy sorszámot rendel minden egyes sorhoz. Ráadásul, erre is van már beépített lehetőség, pl. a ROW_NUMBER() window function.

    Mutasd a teljes hozzászólást!
  • ROW_NUMBER()-t nem minden mysql kezeli.

    Én ha az összes adat számát szeretném lekérni akkor a mysql  INFORMATION_SCHEMA tábláját is kihasználnám.

    SELECT TABLE_ROWS AS `all`, `p`.* FROM INFORMATION_SCHEMA.TABLES LEFT JOIN(`hajszalak` AS `p`) ON (1=1) WHERE TABLE_NAME = 'hajszalak'
    Mutasd a teljes hozzászólást!
  • Hali!

    ROW_NUMBER()-t nem minden mysql kezeli.

    A 8-astól kezdve van ez a lehetőség, Aladár pedig ennél a projektnél* – saját elmondása szerint – azt használ.

    Én ha az összes adat számát szeretném lekérni akkor a mysql  INFORMATION_SCHEMA tábláját is kihasználnám.

    Ami alapvetően jó is, ha tényleg csak szimplán egy tábla bármiféle szűrés nélküli sorainak számára van szükséged. Amint nem egy tábla (hanem pl. egy több táblás JOIN) és/vagy valamilyen kritériumok szerint szűrt eredményhalmaz sorainak számára vagy kíváncsi, nem segít az INFORMATION_SCHEMA lekérdezése. De minek is, amikor egy COUNT(*)-os lekérdezés teljesen megfelelő.

    * Persze, lehet, hogy ez a projekt már nem az a projekt. 

    Mutasd a teljes hozzászólást!
  • Ez milyen előnnyel fog járni egy sima "SELECT COUNT(*) FROM hajszalak" lekérdezéshez képest? Azt ugye már nem tudja, amit a kérdező szeretne, hogy egy lekérdezésből kapja meg a két dolgot.
    Mutasd a teljes hozzászólást!
  •  Azt ugye már nem tudja, amit a kérdező szeretne, hogy egy lekérdezésből kapja meg a két dolgot.


    1 Lekérdezés az, hogy egy 1 query parancsal hívsz le adatot.
    Az már más tészta, hogy a lekérdezésen belül táblákat kapcsolsz össze.
    Mutasd a teljes hozzászólást!
abcd