فرز نتائج البحث من MySQL حسب موضع استعلام البحث في السلسلة باستخدام PHP
سؤال
أريد أن تكون نتائج البحث الخاصة بي من أجل موقف السلسلة من الأصغر إلى الأكبر. على سبيل المثال، ابحث عن "الموز" عوائد:
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)