Ordina risultati della ricerca da MySQL dalla posizione della query di ricerca nella stringa utilizzando PHP
Domanda
Voglio che i miei risultati di ricerca siano in ordine di posizione della stringa dal più piccolo al più grande. Ad esempio, la ricerca di rendimenti "banana":
Alimenti per l'infanzia, prugne, banane e riso, teso
Banane, disidratati, o banane in polvere
Banane greggio
Pane, banana, preparati da ricetta, fatta con la margarina
Campbell Soup Company, V8 SPLASH succo di bevande, della banana della fragola
Campbell Soup Company, V8 SPLASH Smoothies, Fragola Banana
Campbell Soup Company, V8 V. FUSION Succhi di banana della fragola
che voglio "Banane greggio" a venire in primo luogo perché "banana" è la prima parola nel risultato, e voglio "Campbell Soup ..." a venire scorso perché "banana" è l'ultima parola.
So che posso utilizzare strpos () per trovare la posizione, ma come faccio a mettere tutto insieme?
Soluzione
Si può fare facilmente in MySQL.
SELECT title,LOCATE('banana',title)
FROM myTable
WHERE LOCATE('banana',title) > 0
ORDER BY LOCATE('banana',title)
titolo rappresentano colonna della tabella di MySql.
Altri suggerimenti
Si comporterà un usort
inutilmente complessi o qualcosa di simile in PHP, meglio farlo nella query, ad esempio:
SELECT data, INSTR(data, 'banana') as index
FROM table
WHERE data LIKE '%banana%'
ORDER BY index != 0, index
È possibile inoltre selezionare INSTR(titles, 'banana') as firstIndex
e l'ordine da quel valore, ASC. Ciò restituirà l'indice dell'indice prima posizione dell'ago nel pagliaio. Tag su una clausola WHERE
che omette tutto ciò che non è LIKE
'%banana%'
e si dovrebbe essere impostato:
SELECT id, pubdate, title, INSTR(title, 'tea') as `index`
FROM article
WHERE title LIKE '%tea%'
ORDER BY `index` ASC;
Se non si ottiene che i dati da una query SQL, è possibile ordinare che l'utilizzo di usort
e < a href = "http://php.net/strpos" rel = "nofollow noreferrer"> stripos
; qualcosa di simile dovrebbe fare:
$arr = array(
"Babyfood, plums, bananas and rice, strained",
"Bananas, dehydrated, or banana powder",
"Bananas, raw",
"Bread, banana, prepared from recipe, made with margarine",
"CAMPBELL Soup Company, V8 SPLASH Juice Drinks, Strawberry Banana",
"CAMPBELL Soup Company, V8 SPLASH Smoothies, Strawberry Banana",
"CAMPBELL Soup Company, V8 V. FUSION Juices, Strawberry Banana",
);
function compare_position($a, $b) {
return stripos($a, 'banana') - stripos($b, 'banana');
}
usort($arr, 'compare_position');
var_dump($arr);
vale a dire. si sono qui con voi ordinamento propria funzione definita, che confronta la posizione (caso-insentive) di "Banana" nei due stringhe ricevuti come parametri.
E si otterrà questo tipo di output per l'array quando vengono ordinati:
$ /usr/local/php-5.3/bin/php temp.php
array(7) {
[0]=>
string(37) "Bananas, dehydrated, or banana powder"
[1]=>
string(12) "Bananas, raw"
[2]=>
string(56) "Bread, banana, prepared from recipe, made with margarine"
[3]=>
string(43) "Babyfood, plums, bananas and rice, strained"
[4]=>
string(61) "CAMPBELL Soup Company, V8 SPLASH Smoothies, Strawberry Banana"
[5]=>
string(61) "CAMPBELL Soup Company, V8 V. FUSION Juices, Strawberry Banana"
[6]=>
string(64) "CAMPBELL Soup Company, V8 SPLASH Juice Drinks, Strawberry Banana"
}
Naturalmente, se si ottiene che i dati da una query SQL, potrebbe essere più facile da fare alcuni calcoli addizionale sul lato SQL ...
se si desidera solo emulare strpos:
select col, locate('banana', col) as pos from t
order by pos < 1, pos, length(col)