Αναζήτηση σε MySQL

Συζητήσεις για την βάση δεδομένων MySQL και το phpMyAdmin

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
grad
Δημοσιεύσεις: 10
Εγγραφή: 10 Μάιος 2006 13:31

Αναζήτηση σε MySQL

Δημοσίευση από grad » 07 Ιαν 2007 12:23

Έχω φτιάξει μια μηχανή αναζήτησης σε PHP/MySQL στην οποία θέλω να προσθέσω ένα επιπλέον χαρακτηριστικό:

Θέλω να κάνω αναζήτηση μιας φράσης ανεξάρτητα από τις καταλήξεις των επιμέρους λέξεων. Π.χ. θέλω να ψάχνω για "αγροτ* ιατρ*" και να μου βγάζει σαν αποτελέσματα όλες τις παρακάτω φράσεις:
αγροτικός ιατρός
αγροτικοί ιατροί
αγροτικά ιατρεία
κ.ο.κ.

Προφανώς οι λέξεις αγροτικ* και ιατρ* θέλω να είναι δίπλα-δίπλα και όχι οπουδήποτε μέσα στο κείμενο. Γνωρίζει κανείς πως υλοποιείται αυτό;

Άβαταρ μέλους
nikirtsi
Δημοσιεύσεις: 169
Εγγραφή: 02 Ιουν 2006 16:35

Αναζήτηση σε MySQL

Δημοσίευση από nikirtsi » 07 Ιαν 2007 23:10

Σέ τέτοιες αναζητήσεις όπου τό κύριο κριτήριο σού θέλεις νά "μοιάζη"
μέ κάποιο πρότυπο, θά πρέπη αντί τού τελεστή ισότητος(=) στό ερώτημα σού νά
χρησιμοποιήσεις τόν τελεστή ταιριάσματος(match openand) "like".

Η MySql καί τυπικώς η πρότυπη Sql σού δίδει αυτή τήν ικανότητα.

Έν παραδείγματι...
A)SELECT COUNT(*) AS Field1 FROM tblUSERS WHERE 'Username' = "NIKIRTSI"
Σού επιστρέφη τό πλήθος τών εγγραφών όπου τό πεδίον Username είναι ΙΣΟ μέ
"NIKIRTSI"

A)SELECT COUNT(*) AS Field1 FROM tblUSERS WHERE 'Username' LIKE "%NIKIRTSI"
Σού επιστρέφη τό πλήθος τών εγγραφών όπου τό πεδίον Username
μοιάζει μέ τό "NIKIRTSI" καί πιό συγκεκριμένα σού επιστρέφει εκείνες τίς
εγγραφές όπου εις τό πεδίο Username ΕΠΑΙΤΕ τό "NIKIRTSI" από Αδιάφορους χαρακτήρες.

Β)SELECT COUNT(*) AS Field1 FROM tblUSERS WHERE 'Username' LIKE "NIKIRTSI%"
Σού επιστρέφη τό πλήθος τών εγγραφών όπου τό πεδίον Username
μοιάζει μέ τό "NIKIRTSI" καί πιό συγκεκριμένα σού επιστρέφει εκείνες τίς
εγγραφές όπου εις τό πεδίο Username ΠΡΟΗΓΕΙΤΟ τό "NIKIRTSI" από Αδιάφορους χαρακτήρες.

Γ) Φυσικώς καί ο συνδιασμός τών δύο αυτών ειδικών χαρακτήρων υφίσταται
καί μπορείς νά γράψης
SELECT COUNT(*) AS Field1 FROM tblUSERS WHERE 'Username' LIKE "%NIKIRTSI%".
Σού επιστρέφη τό πλήθος τών εγγραφών όπου τό πεδίον Username
μοιάζει μέ τό "NIKIRTSI" καί πιό συγκεκριμένα σού επιστρέφει εκείνες τίς
εγγραφές όπου εις τό πεδίο Username ΠΕΡΙΕΧΕΤΑΙ τό "NIKIRTSI".


Θά πρέπη νά έχεις μόνον στόν υπ' όψιν τό ότι η Like είναι όπως καταλαβένεις
ένας σύνθετος μηχανισμός καί αργός, ειδικός όταν εφαρμόζετο σέ οντότητες μέ πολλές εγραφές.

Δία αυτόν τόν λόγο εις τά πεδία όπου εφαρμόζετο ο τελεστής "LIKE" κάλλιστο είναι
νά τά δηλώνεις ώς FULL_SEARCHING (Επρόκειτο γιά μία τεχνική καταμερισμού τής MySql
η οποία κάνει πιό αποδοτική τήν LIKE (τήν ταχυτητα εκτελέσεως τής) εις βάρος τής
μνήμης.)


Γενικότερα αυτό όπου αποκαλλούμε entryField σέ τέτοιες περιπτώσεις σαφώς είναι καί μιά πολλύπλοκή υπόθεσις.
Εις τήν περίπτωσιν σού, θά μπορούσες νά έκανες ένα space_split τό entryField καί κατ' επέκτασιν νά χρησιμοποιούσες συνθέτως τόν τελεστή LIKE.
Ακόμα και ο ήλιος, στό αριστερό μελίγγι μου ανατέλλει καί στό ζερβό δύει.

Απάντηση

Επιστροφή στο “MySQL”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες