فرز نتائج البحث من MySQL حسب موضع استعلام البحث في السلسلة باستخدام PHP

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

  •  20-09-2019
  •  | 
  •  

سؤال

أريد أن تكون نتائج البحث الخاصة بي من أجل موقف السلسلة من الأصغر إلى الأكبر. على سبيل المثال، ابحث عن "الموز" عوائد:


Babyfood، الخوخ، الموز والأرز، توترت

الموز، المجففة، أو مسحوق الموز

موز، الخام

الخبز، الموز، أعد من وصفة، مصنوعة من السمن

Campbell Soup Company، V8 مشروبات عصير Splash، Banana الفراولة

Campbell Soup Company، V8 Splash Scormies، Barrawerry Banana

شركة شوربة كامبل، V8 V. عصائر الانصهار، موز الفراولة


أريد أن تأتي "الموز، الخام" أولا لأن "الموز" هي الكلمة الأولى في النتيجة، وأريد "حساء كامبل ..." للتوصل إلى الماضي لأن "الموز" هي الكلمة الأخيرة.

أعلم أنني أستطيع استخدام Strops () للعثور على الموقف، ولكن كيف يمكنني وضع كل شيء معا؟

هل كانت مفيدة؟

المحلول

يمكنك القيام بذلك بسهولة في MySQL.


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

تمثيل العنوان عمود جدول MySQL.

نصائح أخرى

سوف تنطوي على مجمع دون داع usort أو شيء مشابه في PHP، أفضل للقيام بذلك في الاستعلام، على سبيل المثال:

SELECT data, INSTR(data, 'banana') as index
FROM table
WHERE data LIKE '%banana%'
ORDER BY index != 0, index

يمكنك أيضا اختيار 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;

إذا لم تحصل على هذه البيانات من استعلام SQL، فيمكنك فرز ذلك باستخدام 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);

أي أنت هنا الفرز مع وظيفة محددة خاصة بك، مما يقارن الموضع (القضية العاصفة) من "الموز" في السلتوين يتلقى كمعلمات.


وستحصل على هذا النوع من الإخراج لمصفيفك، بمجرد فرزها:

$ /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 ...

إذا كنت ترغب فقط في محاكاة Strops:

select col, locate('banana', col) as pos from t
order by pos < 1, pos, length(col)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top