5

検索結果を、文字列の位置が小さいものから大きいものの順に並べたいと考えています。たとえば、「バナナ」を検索すると、次の結果が返されます。


離乳食、プラム、バナナ、米、裏ごし

バナナ、乾燥バナナ、またはバナナパウダー

バナナ、生

パン バナナ レシピ通り マーガリン入り

キャンベル スープ カンパニー、V8 SPLASH ジュース ドリンク、ストロベリー バナナ

CAMPBELL Soup Company、V8 SPLASH スムージー、ストロベリー バナナ

CAMPBELL Soup Company、V8 V. FUSION ジュース、ストロベリー バナナ


「バナナ」は結果の最初の単語であるため、「バナナ、生」を最初に表示し、「バナナ」は最後の単語であるため、「CAMPBELL Soup...」を最後に表示します。

strpos() を使用して位置を見つけることができることは知っていますが、どうすればすべてをまとめることができますか?

4

5 に答える 5

5

これは MySQL で簡単に実行できます。


 SELECT  title,LOCATE('banana',title)
 FROM myTable   
 WHERE  LOCATE('banana',title) > 0
 ORDER BY LOCATE('banana',title) 

タイトルは、MySql テーブルの列を表します。

于 2010-01-12T05:24:38.760 に答える
0

INSTR(titles, 'banana') as firstIndexその値、ASC で選択して並べ替えることもできます。これは、干し草の山内で針の最初に見つかったインデックスのインデックスを返します。WHEREそうでないものを省略した句にタグを付けて、LIKE '%banana%'設定する必要があります。

SELECT id, pubdate, title, INSTR(title, 'tea') as `index`
FROM article
WHERE title LIKE '%tea%'
ORDER BY `index` ASC;
于 2010-01-12T05:07:30.263 に答える
0

これには、不必要に複雑なusort、または PHP に類似したものが含まれます。たとえば、次のようにクエリで実行するのが最善です。

SELECT data, INSTR(data, 'banana') as index
FROM table
WHERE data LIKE '%banana%'
ORDER BY index != 0, index
于 2010-01-12T05:12:01.687 に答える
0

strpos をエミュレートするだけの場合:

select col, locate('banana', col) as pos from t
order by pos < 1, pos, length(col)
于 2010-01-12T05:12:24.213 に答える
0

そのデータを SQL クエリから取得しない場合は、 and を使用して並べ替えることができusortますstripos。このようなことを行う必要があります:

$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);

つまり、ここでは、パラメータとして受け取った 2 つの文字列の "Banana" の位置 (大文字と小文字を区別しない) を比較する独自の定義済み関数で並べ替えています。


そして、ソートすると、配列に対してこの種の出力が得られます。

$ /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"
}


もちろん、SQL クエリからそのデータを取得する場合は、SQL 側で追加の計算を行う方が簡単かもしれません...

于 2010-01-12T05:18:01.853 に答える