Προς το περιεχόμενο

SQL SELECT * και COUNT(*) σε μία εντολή


alkisg

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα,

σε κάποιον κώδικα ενός φόρουμ υπάρχουν πολλές εντολές σαν τις παρακάτω:

 

>SELECT COUNT(*)
FROM (ένα σωρό tables)
WHERE (ένα σωρό συνθήκες)

και αμέσως μετά η ίδια εντολή χωρίς το COUNT:

>SELECT (ένα σωρό πεδία)
FROM (ένα σωρό tables)
WHERE (ένα σωρό συνθήκες)
LIMIT 1,10

Μπορώ με κάποιον τρόπο να κάνω μόνο την δεύτερη εντολή, αλλά να πάρω και το COUNT; Το έχω δει στο phpmyadmin, όπου του δίνεις μια SELECT, βάζει μόνο του τα LIMITs και σου λέει κι όλας "Σύνολο εγγραφών = τόσο"...

 

Ή μήπως όταν κάνουμε COUNT(*) η MySQL καταλαβαίνει ότι θα ακολουθήσει κι άλλη SELECT, οπότε κάνει cache το αποτέλεσμα και έτσι δεν υπάρχει διαφορά στην ταχύτητα;

Δημοσ.

Συνήθως τέτοια κόλπα - να κάνεις ένα SELECT που να γυρνάει εγγραφές αλλά να ξέρεις και τον αριθμό τον γραμμών - τον κάνουμε μέσω stored procedures. Το "μυστικό" είναι ότι υπάρχουν κάποιες μεταβλητές στην SQL, που κάνουν το μέτρημα για εμάς.

 

Πχ. στον MS SQL Server και στην Oracle υπάρχει η μεταβλητή ROWCOUNT που μετά από ένα SELECT statement έχει τον αριθμό των γραμμών που έχουν επιστραφεί.

 

 

George J.

Δημοσ.

H ROW_COUNT() επιστρέφει μόνο μετά από writes, όχι reads όπως το SELECT... :/

 

Κι εγώ θα θελα να το μάθω αυτό κάποια στιγμή πάντως... ιδιαίτερα χρήσιμο για pagination κτλ...

Δημοσ.

an exeis treksei mia entoli sql me tin entoli mysql_query gia paradigma, tote me tin mysql_num_rows kai me parametro to result tis query entolis tote tha sou epistrepsei ton arithmo ton rows. Me loop tote perneis kai ta fields apo to result sou opos kaneis panta. Enalaktika h entolh found_rows sto link pou edoses isos voithisi.

Δημοσ.

Όντως με το mysql_num_rows επιστρέφει τον αριθμό των rows του limit. Αλλά το found_rows από την άλλη λειτουργεί όπως το πρέπει επιστρέφοντας το σύνολο (πάντα με βάση το mysql manual). Αν και αυτό δεν ξέρω αν σε καλύπτει γιατί το σύνολο λογικά το θέλεις πριν από το query με το limit για επιστρέψει το σωστό φάσμα (αν και γίνεται με κάπως λιγότερους ελέγχους να δημιουργείς το pagination μετά το query).

Δημοσ.

Τελικά το FOUND_ROWS() όντως δουλεύει, αρκεί προηγουμένως να έχεις βάλει SQL_CALC_FOUND_ROWS στη SELECT.

 

Διάβασα όμως πολλά παράπονα: ταχύτητας (π.χ. http://bugs.mysql.com/bug.php?id=18454), ασυμβατότητας, bugs σε παλιότερες εκδόσεις κτλ... Και δεν είδα και καμιά σημαντική βελτίωση στην περίπτωση που το θέλω (δεν έκανα όμως σωστό benchmark, απλά έβλεπα το page generation time που αναφέρει το smf).

Οπότε τζίφος, κάνω 2 SELECT και έχω ήσυχο το κεφάλι μου... :(

 

Ευχαριστώ!

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...