Ordina risultati della ricerca da MySQL dalla posizione della query di ricerca nella stringa utilizzando PHP

StackOverflow https://stackoverflow.com/questions/2046784

  •  20-09-2019
  •  | 
  •  

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?

È stato utile?

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top