alkisg Δημοσ. 26 Μαρτίου 2007 Δημοσ. 26 Μαρτίου 2007 Καλησπέρα, σε κάποιον κώδικα ενός φόρουμ υπάρχουν πολλές εντολές σαν τις παρακάτω: >SELECT COUNT(*) FROM (ένα σωρό tables) WHERE (ένα σωρό συνθήκες) και αμέσως μετά η ίδια εντολή χωρίς το COUNT: >SELECT (ένα σωρό πεδία) FROM (ένα σωρό tables) WHERE (ένα σωρό συνθήκες) LIMIT 1,10 Μπορώ με κάποιον τρόπο να κάνω μόνο την δεύτερη εντολή, αλλά να πάρω και το COUNT; Το έχω δει στο phpmyadmin, όπου του δίνεις μια SELECT, βάζει μόνο του τα LIMITs και σου λέει κι όλας "Σύνολο εγγραφών = τόσο"... Ή μήπως όταν κάνουμε COUNT(*) η MySQL καταλαβαίνει ότι θα ακολουθήσει κι άλλη SELECT, οπότε κάνει cache το αποτέλεσμα και έτσι δεν υπάρχει διαφορά στην ταχύτητα;
gcapnias Δημοσ. 26 Μαρτίου 2007 Δημοσ. 26 Μαρτίου 2007 Συνήθως τέτοια κόλπα - να κάνεις ένα SELECT που να γυρνάει εγγραφές αλλά να ξέρεις και τον αριθμό τον γραμμών - τον κάνουμε μέσω stored procedures. Το "μυστικό" είναι ότι υπάρχουν κάποιες μεταβλητές στην SQL, που κάνουν το μέτρημα για εμάς. Πχ. στον MS SQL Server και στην Oracle υπάρχει η μεταβλητή ROWCOUNT που μετά από ένα SELECT statement έχει τον αριθμό των γραμμών που έχουν επιστραφεί. George J.
alkisg Δημοσ. 26 Μαρτίου 2007 Μέλος Δημοσ. 26 Μαρτίου 2007 Σ' ευχαριστώ Γιώργο... Στην MySQL βρήκα ότι λέγεται ROW_COUNT(): http://dev.mysql.com/doc/refman/5.0/en/information-functions.html Μένει να δω αν έχει διαφορά στην απόδοση!
Dikemou Δημοσ. 26 Μαρτίου 2007 Δημοσ. 26 Μαρτίου 2007 H ROW_COUNT() επιστρέφει μόνο μετά από writes, όχι reads όπως το SELECT... :/ Κι εγώ θα θελα να το μάθω αυτό κάποια στιγμή πάντως... ιδιαίτερα χρήσιμο για pagination κτλ...
death2all Δημοσ. 26 Μαρτίου 2007 Δημοσ. 26 Μαρτίου 2007 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.
alkisg Δημοσ. 26 Μαρτίου 2007 Μέλος Δημοσ. 26 Μαρτίου 2007 Dikemou γάτος είσαι, για pagination το θέλω, πατσάρω το simple machines forum! Παράδειγμα , όπου του έχω προσθέσει κάτι σαν downloads module. @death2all: > mysql_num_rows: Νομίζω ότι αν έχεις LIMIT, τότε δεν επιστρέφει τις συνολικές αλλά του LIMIT... Τσεκάρω κι αυτό και το found_rows και επανέρχομαι, thanks!
death2all Δημοσ. 26 Μαρτίου 2007 Δημοσ. 26 Μαρτίου 2007 Όντως με το mysql_num_rows επιστρέφει τον αριθμό των rows του limit. Αλλά το found_rows από την άλλη λειτουργεί όπως το πρέπει επιστρέφοντας το σύνολο (πάντα με βάση το mysql manual). Αν και αυτό δεν ξέρω αν σε καλύπτει γιατί το σύνολο λογικά το θέλεις πριν από το query με το limit για επιστρέψει το σωστό φάσμα (αν και γίνεται με κάπως λιγότερους ελέγχους να δημιουργείς το pagination μετά το query).
alkisg Δημοσ. 26 Μαρτίου 2007 Μέλος Δημοσ. 26 Μαρτίου 2007 Τελικά το FOUND_ROWS() όντως δουλεύει, αρκεί προηγουμένως να έχεις βάλει SQL_CALC_FOUND_ROWS στη SELECT. Διάβασα όμως πολλά παράπονα: ταχύτητας (π.χ. http://bugs.mysql.com/bug.php?id=18454), ασυμβατότητας, bugs σε παλιότερες εκδόσεις κτλ... Και δεν είδα και καμιά σημαντική βελτίωση στην περίπτωση που το θέλω (δεν έκανα όμως σωστό benchmark, απλά έβλεπα το page generation time που αναφέρει το smf). Οπότε τζίφος, κάνω 2 SELECT και έχω ήσυχο το κεφάλι μου... Ευχαριστώ!
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.